模型数或运算快
这里我们以MySQL自带的world数据库中的country表为例。
向name列添加索引
create index index_name on country(name);
查看country表索引
show index from country;
explain select count(1) from country where name like '%Aruba%'
在 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字段的取值,可以评估查询的性能并优化查询。通常来说,使用索引查询会比全表扫描查询更快速、更高效。因此,尽可能地使用索引来优化查询是一个很好的选择。
explain select count(1) from country where Name like '%Aruba'
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);
explain select pow(Population,2) from country;
where语句中使用or来连接的字段,如果一个有索引一个没索引,那么存储引擎将放弃索引而全表扫描
explain select count(1) from country where name like 'Aruba%' or SurfaceArea=193;
对索引的列进行算术运算将使索引失效。
explain select count(1) from country where Population+1>100000;
嘴和索引,查询的条件列不是联合索引的第一个列,索引失效。
给Continent,Region,IndepYear字段创建联合索引
create index index_union on country(Continent,Region,IndepYear);
explain select count(1) from country where Region='Caribbean' and Continent='North America';
explain select count(1) from country where IndepYear IS NULL and Continent='North America';
当查询数量超过表的一部分,索引就会失效。
explain select count(1) from country where Population>=0;