博客探讨了在使用TP框架进行SQL查询时,如何处理多表关联并准确计算每条数据关联的子表记录数。原始查询由于执行顺序导致数据不准确,通过使用DISTINCT函数进行了优化。然而,当线上数据量增大时,DISTINCT操作可能效率低下。因此,作者提出了新的优化查询方式,通过LEFT JOIN子查询分别计算A与B、A与C的关联记录数,确保了查询效率和准确性。 摘要由CSDN通过智能技术生成

问题:想查询某个表A里面的数据关联的分表B数据,需要查询出A中每条数据中关联了B中多少条数据,还需要查出A关联表C中,每条A关联了多少条C中的数据。我用的是TP框架,当我直接用count()查询,关联两个表同时查询的时候会出现查询的数据量不正确的问题,具体原因和执行的顺序有关。最后采用的是DISTINCT函数查询,测试没有问题但是线上数据比较多就会出问题。所以优化了一下写法

原来写法:

SELECT COUNT( DISTINCT C.sexp_id) AS count1, COUNT( DISTINCT (B.id)) AS count2 LEFT JOIN C ON A.id = C.id LEFT JOIN B ON A.e_id = C.id ORDER BY A.id DESC LIMIT 0,
SELECT
    t2.count2,
    t1.count1
LEFT JOIN (SELECT id,COUNT(C.id) AS  count2 FROM C group by id) t2  ON A.id = t2.id
LEFT JOIN (SELECT id,COUNT(B.id) AS  count1 FROM B group by id) t1 ON A.id= t1.uid
ORDER BY
    A.id DESC
LIMIT 0,
				
有这样的一个需求:select count(distinct nick) from user_access_xx_xx; 这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user_access_xx_xx上加上nick的索引, 通过查看执行计划,也为全索引扫描,sql在执行的时候,会对整个服务器带来抖动; root@db 09:00:12>select count(distinct nick) from user_access; +———————-+ | count(d
MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。 本人从2013年7月份起,一直在美团
MySQL是程序员必须要掌握的,其实语法结构相比于其他的数据结构、Java、C++来说应该算是简单的,只要多多练习,拿下它应该不成问题。本文是将我学过的面试笔试重点的知识进行归纳总结,如果你认为写的不错的话,求点赞,求收藏,感谢!!! 一、MySQL数据库基础 1,数据库的操作 1.1、显示当前数据库 show databases; 1.2 、创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specif..
MySQL 查询中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。 关键词 DISTINCT 用于返回唯一不同的值,就是去重啦。用法也很简单: SELECT DISTINCT * FROM tableName DISTINCT 这个关键字来过滤掉多余的重复记录只保留一条。 另外,如果要对某个字段去重,可以试下: SELECT *, COUNT(DISTINCT nowamagic) FROM table GROUP BY nowamagic 这个用法,MySQL的版本不能太低。 在编写查询之前,我们甚至应该对过滤条件进行排序,真正高效的条
FROM tableX WHERE down_stream LIKE ‘%疫苗%’ AND (save_flag is null or save_flag = ‘’) AND is_deleted = 0 这条SQL耗时大概7秒左右,使用分页插件后会更慢,查询索引类型为index 调优过程: 控制变量法: 方案一:去掉该SQL中的DISTINCT后该SQL耗时0.8秒,但不能满足去重需求,查询