先给出数据表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是索引,排序应该是很快的。
万千封印
TA贡献1891条经验 获得超3个赞
你的sql慢的原因是用了子查询,而你的数据超过2000w,在实际使用中,是绝对强烈不推荐大数据中使用子查询的,你这这句sql可以把数据库服务器拖死。我们的业务中就曾经出现过一句sql拖死整个数据库服务器的案例。谨记。如果你想用一句sql查出来的话,估计会很慢。我能想到的办法是分表;或者将你想要的id存在另外的表中。
添加回答
举报
0/150
提交
取消
