mysql left join 优化 A表50W数据 B表5条数据,搞不懂为什么查询需要5秒左右

敢于试错 发布于 11/04 21:55
阅读 1K+
收藏 0

A(文章)表大约50w数据,B(用户表)表只有5条,通过用户ID关联,查询时间为什么需要5秒左右

查了两天的资料也没有找到解决问题的方法,希望有人能为我解答下疑问,谢谢

加载中
0
mlovewt
mlovewt

直接只查询a表就行了,剩下的就是服务器太差了

敢于试错
敢于试错
A表所有记录都需要分页展示,只需要展示B表的用户名。这里只发了查询总数的SQL,分页的SQL没发上来,耗时差不多,都是5秒左右
0
yeZh_yz
yeZh_yz

你是想用B中的字段去查询A的吧?...是的话用B left join A

敢于试错
敢于试错
A表是信息表,通过uid关联,如果存在用户名就显示,不存在就显示为空
0
开源社区扛把子

你这left  join  ,为啥要关联b表,没看懂,b表都没用上

 

敢于试错
敢于试错
A表是信息表,通过uid关联,如果存在用户名就显示,不存在就显示为空,这里只发了查询总数的SQL,分页的SQL没发上来,耗时差不多,都是5秒左右
0
魔力猫
魔力猫

这个逻辑,肯定是全表扫描,没毛病。

0
mickelfeng
mickelfeng

用B left join A

0
Kit_lee
Kit_lee

首先left join是很消耗资源的,如果要用left join,关联字段需要加索引。

然后A LEFT JOIN B,假设JOIN的字段有加索引,但只在count B表记录时因外键索引受益,而A表是不会left join的字段索引带来的查询受益的。

再来优化一下count,  请不要count(*), 除非有缓存,否则还不如count(索引字段)性能高

最后就是A表最后两个查询条件,建组合索引

敢于试错
敢于试错
A表两个字段有建组合索引的,耗时5秒,我也震惊到,现在就是想不到优化方案。实在不就是就只查A表,然后用程序补充显示用户名
0
码上行动aa
码上行动aa

应该 小表作为驱动表

0
l_1196
l_1196

a.delete_time is null这个不好吧

飞苹果
回复 @敢于试错 : 和left join没关系, 就是a表检索条件的问题, 如果你的检索条件产生的结果大于1/3总记录数(我印象中,可能记错了), 那么索引根本就没生效(扫全表)
l_1196
l_1196
回复 @敢于试错 : 具体啥问题?一般有索引的字段最好别用null。如果想判断是否被删除,可以加个删除标志,而不是用删除时间是否为空判断。
敢于试错
敢于试错
问题不是这个条件上,测试了,出在a.status='2'上面
0
cky宇的季节
cky宇的季节
1. 如果实际查询是count * ,a与b是one to one的关系或者many to one的关系,去除left join不影响count结果 2. 根据explain status==2有10w行, 那么status索引意义不大,可以考虑使用(status,delete time)联合索引
0
cky宇的季节
cky宇的季节
is null是可以可以使用索引的,详情参考官方文档 https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html
返回顶部
顶部