您现在的位置是:网站首页 > 博客日记 >

mysql进阶篇之索引失效因素

作者:YXN-sql 阅读量:88 发布日期:2022-10-02

1、复合索引最左特性

复合索引也称为联合索引,当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

举例:创建联合索引ABC,如果是以最左边开始匹配的字段都可以使用上联合索引,比如:

A+B+C A+B A+C

而 B+C 却不能使用到联合索引,这就是最左匹配原则。

联合索引不满足最左原则,索引一般会失效。

2、模糊查询右模糊

例如下面,只有1使用索引,2可以利用`reverse + function index`的形式变为1

1. 模糊匹配后面任意字符:like '张%'

2. 模糊匹配前面任意字符:like '%张'

3. 模糊匹配前后任意字符:like '%张%'

3、在索引列进行 列运算、使用内置函数、类型转换

列运算:select * from study where id+1=2;

使用内置函数:select * from study where ifnull(id,0)=1;

类型转换:比如 address 为字符串类型,而查询的时候设置了 int 类型的值(隐式或显式类型转换)

select * from study where address =1;

4、使用 !=,<>,is null,is not null

1. 并不是说使用了 is null 或者 is not null 就会不走索引了,跟 mysql 版本以及查询成本都有关;

2. 如果 mysql 优化器发现,走索引比不走索引成本还要高,就会放弃索引

3. 当字段可以为空使用 is null 会使用索引,不为空不使用,is not null不管可不可为空都不使用,可以把 null 值,换成默认值,比如:select * from study where age>0

5、OR 前后只要存在非索引的列,都会导致索引失效

6、数据库和表的字符集统一使用utf8mb4

不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

7、查询条件数据量过大

如果WHERE子句过滤出的数据行数超过表总数据的15%,MySQL可能会选择全表扫描而不是使用索引。

 

 

YXN-sql

2022-10-02