MySQL索引失效的七大场景

文章目录

  • 口诀
  • 初始化数据库
  • 索引失效七大场景
    • 模(模糊查询)
    • 型(数据类型)
    • 数(函数)
    • 或(OR)
    • 运(运算)
    • 最(最左原则)
    • 快(查询数据量大)

口诀

模型数或运算快

初始化数据库

这里我们以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);

MySQL索引失效的七大场景_第1张图片

  • 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,索引失效。

你可能感兴趣的:(数据库,mysql,数据库,sql,索引)