文章目录

  • 索引失效情况
  • 1 索引列运算
  • 2 字符串不加引号
  • 3 模糊查询
  • 4 or连接条件
  • 5 数据分布影响



索引失效情况

1 索引列运算

不要在索引列上进行运算操作, 索引将失效。

目前表格拥有的索引:

show index from tb_user;

mysql 内置函数会让索引失效么 mysql使用函数索引失效_mysql

当根据phone字段进行函数运算操作之后,索引失效。

explain select * from tb_user where substring(phone,10,2) = '15';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_数据库_02


当根据phone字段进行等值匹配查询时, 索引生效。( 没有进行运算 )

explain select * from tb_user where phone = '17799990015';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_SQL_03

2 字符串不加引号

字符串类型字段使用时,不加引号,索引将失效。

explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_MySQL_04

explain select * from tb_user where profession = '软件工程' and age = 31 and status = 0;

mysql 内置函数会让索引失效么 mysql使用函数索引失效_MySQL_05


status = 0 未加引号,status 字段的索引失效。

explain select * from tb_user where phone = '17799990015';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_MySQL_06

explain select * from tb_user where phone = 17799990015;

mysql 内置函数会让索引失效么 mysql使用函数索引失效_数据库_07


未加引号,phone字段的索引失效。

3 模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

explain select * from tb_user where profession like '软件%';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_SQL_08


尾部模糊查询,索引不失效。

explain select * from tb_user where profession like '%工程';

mysql 内置函数会让索引失效么 mysql使用函数索引失效_SQL_09


头部模糊查询,索引失效。

在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字前面加了%,索引将会失效。

4 or连接条件

用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

explain select * from tb_user where id = 10 or age = 23;

id为主键,具有主键索引,age不具有索引,所以,id的索引会失效。

mysql 内置函数会让索引失效么 mysql使用函数索引失效_mysql_10


对age建立索引

create index idx_user_age on tb_user(age);
explain select * from tb_user where id = 10 or age = 23;

mysql 内置函数会让索引失效么 mysql使用函数索引失效_数据库_11


age字段加了索引之后,索引生效。

5 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。

查询数据时,与查询全表速度相近,MySQL不会使用索引,会进行全表查询。

MySQL在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则放弃索引,走全表扫描。 因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不如走全表扫描来的快,此时索引就会失效。

是否会使用索引取决于MySQL评估,走索引快,还是全表扫描快。是否走索引,得具体情况具体分析,并不是固定的。(由MySQL进行判断)