摘要
IN 一定走索引吗?那当然了,不走索引还能全部扫描吗?好像之前有看到过什么Exist,IN走不走索引的讨论。但是好像看的太久了,又忘记了。哈哈,如果你也忘记了MySQL中IN是如何查询的,就来复习下吧。
问题
问题要从之前的统计店铺数关注人数说起
SELECT shop_id, count(user_Id) as attentionNumber
FROM shop_attention
WHERE shop_id IN
#{shopId}
GROUP BY shopId
复制代码
当时是从缓存的角度来分析如何进行优化。有兴趣看这篇微服务化后缓存怎么做
将这个查询收敛,应用端做了缓存后,确实没什么大问题了。但是随着店铺关注数的增加,慢SQL开始出现了
在我们的业务中,将100ms的SQL查询定义为慢查询,需要优化的。优化不了必须要控制查询频次。同时超过5s的数据库操作会被kill掉,防止拖垮整个数据库,导致相关应用都受到牵连。
该SQL执行时间耗时已经几百ms了,必须要优化了。阿里云对这个SQL的检测报告时
扫描行数和返回行数比例超过了100
使用了group_by函数,注意检查group_by是否用到了索引
分析
首先可以确定的是,group by 的shop_id字段肯定是建了索引的,那么扫描行数和返回行数比例为什么这么大呢?
先复习下分析查询语句的三大要素
响应时间,意思很明确,不多解释了
扫描行数 整个查询过程中扫描了多少行
返回行数 查询结果命中的行数<