MySQL中不会命中索引的情况

MySQL中不会命中索引的情况,第1张

我们简单建了一张表,如下:

我们建立了两个索引,分别为主键索引id和普通索引product_id

如果我们的where条件中存在or,及时其中带索引,也不会命中索引。这也是为什么尽量使用or的原因

我们通过主键索引查询,可以看见命中了索引:

而我们在where 条件后面加上or之后,就不会命中索引了:

可以看到如果用like查询的话,%在右边会命中索引的,而%在左边则不会。当然这也不是绝对的,当我们使用索引列进行查询的时候,就都会命中索引了:

NOT IN,NOT LIKE,NOT EXTSTS都不会命中索引

创建表

该表的记录如下:

添加两个索引:

通过 explain 来查看:

会命中两条索引,但实际只用了 idx_v1,即使实际查询用联合索引更好,也依然只用了 idx_v1。

之前的测试,发现用的是第一个,我们删除索引,把之前的索引语句顺序换一下:

发现用的是第一个。

mysql千万数据加索引卡死关键字?

想到了从以下方法进行解决:

1)重写Sql,让查询命中索引

2)增加索引

3)1)或者2)方法之后,再加上一个缓存功能

最快捷的方式肯定是2了,但是本表由于逻辑复杂,时不时又批量录入一些数据,已经有了5个索引了,再加索引,恐怕会导致写入慢的问题,而且加索引可能会引起锁表问题。

于是,我先想用方法1解决,可是由于逻辑有点复杂,查询语句比较复杂,改了很多写法都不理想,最后还是选择了方法2,直接表加索引。

由于对于加索引的一些担忧,于是我在本地先尝试了一下(本地数据和线上数据量基本一致,相差不大),结果没想到还挺快的,对于写入的性能也没多大的影响。加入索引后页面秒开,效果很好。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6121793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存