Mysql
-
EXPLAIN
type(索引类型):
system>const>eq_ref>ref>range>index>all
system,const,eq_ref
基本达不到的;
consts:仅仅能查到一条语句的sql,用于 主键索引,唯一索引(和索引类型有关)
eq_ref:唯一索引,对于每个索引的查询,返回匹配相等且唯一行的数据(只有一个,不能多,不能为0)
ref:非唯一索引,对于每个索引键的查询,返回匹配的所有行的数据(可以多,可以为0)
range:检索指定范围查询,where后面是一个范围查询 between,><,in(特俗情况会失效)
index:查询表中全部索引 select industry_id from lwl_insdutry;(industry_id 是索引)扫描索引表
all: 查询表中全部数据 扫描全表
show index form tables (查询tables表中的索引)
总结:
system/conts:结果就是一条,实际开发中基本很难实现;
eq_ref:结果多条,但每条都是唯一数据;
ref:结果多条,每条数据是0或者多条
-
possible-keys:可能用到的索引,是一种预测,不准的
-
key:实际使用到的索引
-
key_len:索引长度:作用:判断复合索引是不是完全被使用
-
ref:指明当前表 参照的字段
例如:EXPLAIN SELECT * FROM lwl_articles a ,lwl_users u WHERE a.users_id = u.id and a.author = ‘lwl’
a表:外建users_id 加了索引,所以在u表中ref:是用到了users_id;
a表:author 这个字段家了索引 ,所以a表中ref:是它的值 常量;
6.extra
(1).当出现 using filesort 效率极低 一半出现在 order by 语句中
-
例如:单索引数据表的情况下
表:user 字段:users_id, author; 索引:users_id, author; ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114171207961.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzY0NzU5Ng==,size_16,color_FFFFFF,t_70) 原因:由于 查询的字段仅仅查询了author字段,但是用的users_id字段排序,所以在查询出结果集后,还要再次查询users_id用于排序;------(单索引,避免数显以上多余查询情况下,查询字段要和排序字段相对应)
不友好:EXPLAIN select author FROM lwl_articles ORDER BY users_id ---Using filesort
避免:EXPLAIN select author FROM lwl_articles ORDER BY author
查询什么字段,就用什么字段排序
-
复合索引(左前缀)
表:demo columns:id, name,age,sex index(复合索引):name,age,sex
不友好:EXPLAIN select name,sex FROM lwl_articles ORDER BY name,sex ---Using filesort 缺少 age,
不友好:EXPLAIN select sex,name,age FROM lwl_articles ORDER BY sex,name,age ---Using filesort 缺少 顺序不对,
避免:EXPLAIN select name,age,sex FROM lwl_articles ORDER BY name,age,sex
复合索引完全按照左前缀原则:name,age,sex 不可跨字段,无序
(2).当出现 using temporary 效率极低 一半出现在 group by,临时表
不友好:EXPLAIN select sex FROM lwl_articles ORDER BY name ---Using temporary
避免:EXPLAIN select sex FROM lwl_articles ORDER BY sex
查询什么 就用什么分组
(3). 当出现:using index,性能提升,索引覆盖,仅仅只读取索引表,
例如:复合索引 name, age,sex
EXPLAIN select name, age,sex FROM lwl_articles where name=‘’, age=‘’,sex=‘’
(4). 当出现:using where,性能提升,索引没完全覆盖,不仅仅只读取索引表,还读取了数据表
例如:复合索引 name, age
EXPLAIN select name, age FROM lwl_articles where name=‘’, age=‘’,sex = ‘’