-- 联合索引全部覆盖:
select * from t1 where a= b= c= / a in b in c in /b= a= c=
-- 部分覆盖:
select * from t1 where a= b= / a= / a= c=
select * from t1 where a= b<= >= like and c= (只走ab索引)
-- 不覆盖:
select * from t1 where b= c=
-- 查询索引
desc 表名称; -- PRI聚簇索引 MUL辅助索引 UNI唯一索引
show index from 表名; -- 更加详细的索引信息
-- 创建索引:
alter table 表名 add index idx_na(列名); -- 单列索引,idx_na只是索引的名字,随便起
alter table 表名 add index idx_n_c_(列名1, 列名2); -- 联合索引
alter table 表名 add index idx_d(列名(5)); -- 前五个字符构建的前缀索引
-- 删除索引
alter table 表名 drop index idx_na;
③限制索引的数目,索引并不是越多越多好;
④删除不使用或者很少使用的索引,可以使用percona toolkit工具;
⑤数据很多的表中如果加索引建议在业务不繁忙时段进行操作;
⑥尽量不要在经常更新值的列上创建索引,容易引起索引失效。
③索引失效,统计的数据不真实,索引有自我维护的能力,对于表内容变化比较频繁的情况下,统计信息不准确,有可能会出现索引失效,一般是删除重建。
④查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等);
⑤隐式转换导致索引失效,这一点应当引起重视。也是开发中经常会犯的错误.查询的时候注意数据类型是否和表中定义的数据类型是否一致。
⑥< > ,not in 不走索引(辅助索引,单独的> < in有可能走索引也可能不走,尽量结合业务添加limit,or 和 in 使用不同的条件进行测试,选择哪种具体的方案)。
⑦like “%_” 百分号在最前面不走,%linux%类的搜索需求,可以使用elasticsearch+mongodb 专门做搜索服务的数据库产品.
-- 二者任选其一
desc sql语句;
explain sql语句;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | city | NULL | ALL | NULL | NULL | NULL | NULL | 4046 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
开发人员就可以根据上述执行计划进行分析了,如何进行分析,就要看结果中的每个字段表示啥意思了,请听小庄娓娓道来~
table:执行计划涉及到的表,针对多表查询时,能够帮助确定查询较慢的表进行优化。
type:查询类型,分为全表扫描和索引扫描。
全表扫描ALL:不用到任何的索引(全表查询/ not in/ like '%&'等情形不会走任何索引)
索引扫描:index<range<ref<eq_ref<const(system)
index:全索引扫描,需要扫描整颗索引树
range:索引的范围查询,当查询>= <= like in or between and等条件时属于范围查询,对于id查询 not in !=是走range索引的
ref:辅助索引的等值查询
eq_ref:多表连接中,非驱动表的连接条件是主键或者唯一键
const(system):聚簇索引等值查询
-- 在查询数据的时候如果有多个条件子句,需要使用联合索引,单列索引不会生效。
select * from city where countrycode='CHN' order by population; -- population单列索引不会生效,index(countrycode, population)生效
key_len:联合索引覆盖长度,评估联合所用的应用长度,对于联合索引比如index(a, b, c)希望将来的查询语句对于联合索引的应用越充分越好,key_len可以帮助判断此次查询走了联合索引的几部分。
在完全覆盖的情况下:key_len = a长度 + b长度 + c长度
长度受到数据类型、字符集的影响,指的是列的最大储值字节长度
没有约束not null时,需要单独一个字节存储列值是否是非空数字列的储值长度:
数字类型/是否非空(not null) | 是 | 否 |
tinyint | 1 | 1+1 |
int | 4 | 4+1 |
bigint | 8 | 8+1 |
字符类型/是否非空(not null) | 是 | 否 |
char(10) | 3*10 | 3*10+1 |
varchar(10) | 3*10+2 | 3*10+2+1 |
rows:此次查询需要扫描的行
转载请注明:XAMPP中文组官网 » MySQL之索引原理和执行计划