欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql操作符与索引失效

程序员文章站 2022-06-09 15:59:51
问题: 操作符 in/exists/like/not in/or/bettween...and哪些会引起索引失效? 一.bettween…and 会使用索引,但是需要注意的是它相当于&...
问题:

操作符 in/exists/like/not in/or/bettween...and哪些会引起索引失效?

一.bettween…and

会使用索引,但是需要注意的是它相当于"xxx>=num1 and xxx<=num2",包含等号。

二.like

当like后边跟的是右百分,即'zhangsan%'或'zhang%san%'时都是使用索引的,

当like后边跟字符串最左边带左百分号时,即'%zhangsan'或'%zhangsan%'时,

索引会失效,

所以尽量不使用左百分,如果一定要用左百分使用覆盖索引可以提高效率。

mysql中测试

![测试用表](https://img.blog.csdn.net/20170808174647961?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvbgl0dgvyznjvzw==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/southeast)
![表上索引](https://img.blog.csdn.net/20170808174854615?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvbgl0dgvyznjvzw==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/southeast)
![like测试结果](https://img.blog.csdn.net/20170808175103734?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvbgl0d

三.in

in的使用先上示例
![作用于主键列时](https://img.blog.csdn.net/20170808180229191?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvbgl0dgvyznjvzw==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/southeast)
![作用于非主键列时](https://img.blog.csdn.net/20170808180307705?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvb

个人理解:

当in作用于主键列时会使用索引,所以条件是主键时可以使用;

当不是主键列最好不用使用in,极有可能导致索引失效

(比如:in里边的值表中不存在时,in里的一个值在表中有多行匹配时)。

所以很多人说不要使用in也不是没有道理。

四.not in

使用not in索引失效。

五.exists

主要是内层循环会用到索引,外层循环不对应查询列。

六.or

与in的情况差不多。在主键列上可以,但非主键列索引失效。