博客探讨了在使用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秒,但不能满足去重需求,查询类