explain
id:select查询序列号,表示查询中执行select子句后者是操作表的顺序,执行先后顺序从小到大
select type:查询类型
- SIMPLE:简单查询,不使用表连接或者子查询
- PRIMARY:主查询,即外层查询
- UNION:联合查询中的第二个以及以后的查询语句
- SUBQUERY:子查询
table:当前查询操作涉及的表
type:索引访问类型,从慢到快依次为
NULL:MYSQL不用访问表或者索引就直接能到结果。
explain select version();const/system:根据主键、普通唯一索引列等值匹配查询(is null除外),这种查询是很快的,查询速率认为是常数级别的,定义为const。单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。例如根据主键或者唯一索引进行的查询。
-- 根据主键等值匹配查询 explain select * from staff where sid = 2324;eq_ref,相对于ref来说就是使用的是唯一索引,对于每个索引键值,只有唯一的一条匹配记录(在联表查询中使用primary key或者unique key作为关联条件)
ref:根据普通索引等值匹配,或is null。(前面说的普通唯一索引列查询时 is null也是这种场景)。这种方式需要先根据普通索引匹配到多个主键,然后根据主键进行回表。使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。
-- 根据普通唯一索引匹配 is null explain select * from test_index where key2 is null; -- 根据普通索引等值匹配 explain select * from staff where sname = '相昂然';range:根据主键索引或普通索引(包含唯一索引)进行范围查找
-- 根据主键索引进行范围查询 explain select * from staff where id < 10; -- 根据普通唯一索引进行范围查找 explain select * from staff where sid < 20 and sid > 10;index:全索引扫描。索引全扫描,MYSQL遍历整个索引来查找匹配的行。(虽然where条件中没有用到索引,但是要取出的列title是索引包含的列,所以只要全表扫描索引即可,直接使用索引树查找数据)
explain select did, leader from staff;all:全表扫描,直接扫描主键索引,挨个数据进行判断,这种访问方式称为all。
-- 非索引列查找 explain select * from staff where sex = 1;
possible_key:显示可能会使用到的索引,一个或者多个
key:实际使用的索引,NULL表示没有使用索引
key_len:索引使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,越短越好
rows:InnoDB认为必须要执行查询的行数,是一个估计值
filtered:表示返回结果的行数占需读取行数的百分比,filter值越大越好
最左前缀匹配原则是指SQL中用到的字段可以匹配某个索引的最左前缀,SQL中字段顺序任意。
explain select * from staff where leader = 2326 and did = 4106;
因为age=23无论如何都会全盘扫描,那就直接不用索引全盘扫了
SQL提示
SQL建议
没有用到主键索引
上面的性能高
username\password联合索引
使用两个单个索引会怎么样
降低索引IO
回表查询name
联合索引
覆盖查询、回表查询
看看哪个重复的少???
11