为了账号安全,请及时绑定邮箱和手机立即绑定

一条查询极为缓慢的sql语句,如何去优化呢?

一条查询极为缓慢的sql语句,如何去优化呢?

梦里花落0921 2019-04-21 20:14:06
先给出数据表table结构:字段名含义id自增IDname姓名rule_id某种规则对应IDstatus状态目前数据库中数据大概有2000W条,之后可能还会不断增长,现在想要查询的是:从表中找出相同姓名,相同规则ID,并且status=1对应的最后一条记录目前使用的语句,:SELECT*FROMtableWHEREidIN(SELECTmax(id)ASmax_idFROMtableGROUPBYname,rule_id)ANDstatus=1已经做的优化:添加了name,rule_id的索引现在查询时,基本直接卡死,根本查询不出来,像这种情况需要如何优化?包括但不仅包括:1、SQL语句的优化2、如何合理的添加索引各位大神有什么好的优化建议吗?谢谢各位了!!
查看完整描述

2 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

你这个查询语句里面慢应该实在idin(...)这个条件上面慢的,mysql在groupby的效率其实很高的。但是groupby默认会匹配第一个记录,也就是说如果只执行
select*fromtablewherestatus=1groupbynamerule_id;
得到的刚好是对应集合里面id最小的那一条记录。你试试先排序再group一下的效率(把筛选条件放子查询里面,减少groupby的数量)
select*from(
select*fromtablewherestatus=1orderbyiddesc
)astgroupbynamerule_id;
没有测试效率,但是结果应该是对的。这里id是索引,排序应该是很快的。
                            
查看完整回答
反对 回复 2019-04-21
?
万千封印

TA贡献1891条经验 获得超3个赞

你的sql慢的原因是用了子查询,而你的数据超过2000w,在实际使用中,是绝对强烈不推荐大数据中使用子查询的,你这这句sql可以把数据库服务器拖死。我们的业务中就曾经出现过一句sql拖死整个数据库服务器的案例。谨记。
如果你想用一句sql查出来的话,估计会很慢。我能想到的办法是分表;或者将你想要的id存在另外的表中。
                            
查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 1521 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号