开发者学堂课程【MySQL 高级应用 - 索引和锁:explain 之 possible_keys 和 key 介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8603
explain 之 possible_keys 和 key 介绍
一. possible_keys 和 key 含义
possible key 和 key 是一套,要一起讲。
1.这两个可以用判断你是否使用到了你的索引,也既来判断是否索引失效。
2.在多个索引竞争的前提下,MySQL 到底用到了哪个索引
Possible keys:显示可能应用在这张表中的索引,一个或多个。
查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用
示例1:
主人你在我这张表上,建立了四个复合索引,来了一条 sql ,我自己进行分析和判断,四个里面和这次请求有关系的可能有两个,初步 mysql 判断可能用到两个索引,但不一定被查询使用。
Key :实际使用的索引。如果为 NULL ,则没有使用索引
査询中若使用了覆盖索引, 该索引仅出现在 key 列表中
mysql>explain select * from tbl_emp;
Id |
Select_type |
table |
type |
Possible_keys |
key |
Key_len |
ref |
rows |
Extra |
i |
sinpile |
Tbl_emp |
all |
NULL |
NULL |
NULL |
NULL |
8 |
|
1 row in set (0.00 sec)
重要的是 key,key 为 null ,则表示索引失效,或者没有索引。
示例2:
Mysql> explain select t2.*
-> From t1,t2,t3
-> where t1.id=t2.id and t1.id =t3.id
-> and t1.other_colmn=’’;
Possible_keys
为primary,idx_t1、primary、primary
//理论上用主键索引
key为 idx_t1、primary、primary
//实际上用了一个主键索引
3 rows in set (0.00 sec )
示例3:
mysql>explain select t2.* from(
->select t3.id
->from t3
->wheye t3.other_colum=’’)s1,t2
->where s1.id =t2.id;
Possible_keys
为NULL、primary、NULL
//理论中没有用到索引
key 为 NULL、primary、NULL
//实际也没有用到索引
3 rows in set (0.00 sec )
id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中, id 值越大,优先级越高,越先执行
衍生= DERIVED
示例4:
mysql>explain select * from (select * from t1 where id=1)d1;
Possible_keys
为 NULL、primary
//理论上没有用到
key为 NULL、primary
//实际也没有用到
2 rows in set (0.00 sec)
如果是子查询, id 的序号会递增, d 值越大优先级越高;越先被执行。
示例5:
mysq1> explain select co11,co12 from t1;
type 为 index 是索引扫描
Possible_keys 为 NULL(理论上 possible_keys 没有用到扫描)
key为idx_col1_col2(实际上是用到了)
1row in set (0.00 sec )
覆盖索引
是指 select 查询的这些 col1、col2 等查询的字段和我的索引建的个数的字段刚好吻合。简单而言 select 后面查询的字段,和我建复合索引的个数和顺序一一一致。
以下代码为覆盖索引示例:
mysq1> create index idx _co11_co12 on t2(co11,co12);
//建立的索引也是1和2共计两个,顺序也是1和2,个数也是两个,刚好建立的索引 col1 和 col2 ,查的数据也找 col1 和 col2 ,所以可以从索引上找到,而不用全盘扫描。
Query 0K,1001 rows affected (0.17 sec )
Records :101 Duplicates :В Warnings :в