您现在的位置是:首页 >技术交流 >MySQL索引失效的七大场景网站首页技术交流
MySQL索引失效的七大场景
口诀
模型数或运算快
初始化数据库
这里我们以MySQL自带的world数据库中的country表为例。
索引失效七大场景
模(模糊查询)
向name列添加索引
create index index_name on country(name);
查看country表索引
show index from country;
- 测试like完全匹配
explain select count(1) from country where name like '%Aruba%'
可以看到type级别是index。索引失效。
在 MySQL 中,使用 EXPLAIN 语句可以查看查询语句的执行计划,了解 MySQL 如何执行查询。其中,EXPLAIN
语句的结果集中的 type 字段用于表示 MySQL 在执行查询时所使用的访问类型。
type 字段可能的取值包括:
system:表示只有一行数据的表,通常是一些系统表; const:表示只有一行数据的表,通常是通过在查询中指定主键或唯一索引来检索数据;
eq_ref:表示使用了连接索引,且索引的所有部分都被使用,一般出现在连接查询中;
ref:表示使用了非唯一性索引,返回匹配某个单独值的所有行;
fulltext:表示使用全文索引进行搜索;
ref_or_null:表示使用非唯一性索引,但可能存在一个或多个 NULL 值;
index_merge:表示使用了多个索引进行查询,并将结果进行合并;
unique_subquery:表示使用了子查询,并且该子查询使用了唯一性索引;
index_subquery:表示使用了子查询,并且该子查询使用了非唯一性索引;
range:表示使用了索引进行范围查询;
index:表示全表扫描,并且按索引顺序扫描;
all:表示全表扫描。
需要注意的是,type字段的取值顺序是从最好到最差的查询类型顺序。当 type 字段的取值是 system、const、eq_ref 时,性能最好;当 type字段的取值是 all 时,性能最差。
通过查看 type字段的取值,可以评估查询的性能并优化查询。通常来说,使用索引查询会比全表扫描查询更快速、更高效。因此,尽可能地使用索引来优化查询是一个很好的选择。
- 测试like左匹配
explain select count(1) from country where Name like '%Aruba'
type级别为index,索引失效。
- 测试like右匹配
explain select count(1) from country where Name like 'Aruba%';
type级别为range,索引命中!
所以注意模糊查询右匹配可以命中!!!
型(数据类型)
如果数据类型不匹配那么索引就会失效。
如下面的sql
explain select count(1) from country where name=1
数(函数)
对索引的字段使用内部函数,索引也会失效。
对population字段创建索引
create index index_population on country(population);
这里对population字段使用POW函数
explain select pow(Population,2) from country;
索引失效。
或(OR)
where语句中使用or来连接的字段,如果一个有索引一个没索引,那么存储引擎将放弃索引而全表扫描
explain select count(1) from country where name like 'Aruba%' or SurfaceArea=193;
级别为ALL,全表扫描,索引失效。
运(运算)
对索引的列进行算术运算将使索引失效。
explain select count(1) from country where Population+1>100000;
最(最左原则)
嘴和索引,查询的条件列不是联合索引的第一个列,索引失效。
给Continent,Region,IndepYear字段创建联合索引
create index index_union on country(Continent,Region,IndepYear);
- where条件中包含联合索引最左字段
explain select count(1) from country where Region='Caribbean' and Continent='North America';
级别为ref,索引有效。
- where条件中不包含联合索引最左字段
explain select count(1) from country where IndepYear IS NULL and Continent='North America';
索引失效。
快(查询数据量大)
当查询数量超过表的一部分,索引就会失效。
explain select count(1) from country where Population>=0;
Population>=0全部数据都会查出,type是index,索引失效。