MySQL中不会命中索引的情况
2020-06-06 本文已影响0人
科威舟VS求利
表与索引
我们简单建了一张表,如下:
![](https://img.haomeiwen.com/i9905084/7751d6e69d547aff.png)
我们建立了两个索引,分别为主键索引id和普通索引product_id
![](https://img.haomeiwen.com/i9905084/2a1e42ff33fde3c1.png)
是否命中索引
where 条件中带 or会不会命中索引?
如果我们的where条件中存在or,及时其中带索引,也不会命中索引。这也是为什么尽量使用or的原因
我们通过主键索引查询,可以看见命中了索引:
![](https://img.haomeiwen.com/i9905084/4129c908c3740efa.png)
而我们在where 条件后面加上or之后,就不会命中索引了:
![](https://img.haomeiwen.com/i9905084/17ee3388f70fc31e.png)
如果我们想用or又想让它命中索引,那么只能将or条件中的每一列都加上索引了:
![](https://img.haomeiwen.com/i9905084/72145422d56e398a.png)
所以,如果or中有一个条件没有索引的时候,还是建议使用union操作,将多个查询语句拼装在一起:
like查询中会不会命中索引?
![](https://img.haomeiwen.com/i9905084/7c6cef315f5ae741.png)
可以看到如果用like查询的话,%在右边会命中索引的,而%在左边则不会。当然这也不是绝对的,当我们使用索引列进行查询的时候,就都会命中索引了:
![](https://img.haomeiwen.com/i9905084/4d506d6f042712f5.png)
负向查询条件会不会用到索引?
NOT IN,NOT LIKE,NOT EXTSTS都不会命中索引