EXPLANIN
用法
EXPLAIN SELECT * FROM DEPT JOIN EMP ON DEPT.DEPTNO = EMP.DEPTNO
ID
EXPLANIN 中的id属性指出 当前查询语句中相关表文件的加载顺序
情况1
如果被加载的表文件的ID属性内容是相同的 则根据自上而下的顺序执行
情况2
如果被加载的表文件ID属性内容是不相同的。则ID较大的表,就先被加载 ,ID小的表则后被加载
情况3
如果被加载的表文件 有相同 有不同的情况时 则ID大的表先被加载 ID相同则自上而下加载。
总结:ID相同 自上而下 不同则大优先
select_type
SIMPLE 简单的查询
Primary 可能是联合查询 也可能是子查询 指向的外部查询语句或者是联合查询中的第一个子查询
DEPENDENT SUBQUERY
(依赖子查询)
SUBQUERY
(独立子查询)
TYPE 属性
- all 全表扫描
- index 定位数据行的时候没有使用索引 全表扫描, 但已经在已经定位的数据行中读取字段时候,却是使用索引,也就是说 使用select 命令时 根据索引读取数据 (执行效率低)
- range 定位数据行,使用 到索引 使用区间定位的方式 (where score>60) 这种状态实际上是不稳定的状态 如果定位的数据行 超过了表中行数30%以上 导致mysql放弃使用索引进行定位
- ref:定位数据行的时候采用索引,采用直等的方式 where ename=‘mike’ 同时满足定位条件的数据行 只有一行。
- const:定位数据行,使用到索引,采用主键索引直等方式 where score = 60
- (少见)system 操作表里面只有一行数据,并且数据的内容是固定不变的
SQL优化时 最低要达到range级别 最高达到 ref
possible keys: 本次查询中可能使用的索引有哪些
key:在本次查询中 实际使用索引有哪些 当要使用多个索引时 mysql会使用性能最高的那个索引
key len 表示当前采用索引字段的字段长度 越长说明定位越准,越短 定位越不准确
索引使用规则
注意!
1.如果在索引字段上使用了函数 ,则会导致索引失效
2.索引字段上使用了相关的运算 索引会失效
3.如果索引字段上 产生了(隐式类型转换),导致索引失效。 就是 varchar = int 类似这样的。
如果索引字段上进行了模糊查询
explain select * form emp where ename like ‘m%’
explain select * form emp where ename like ‘%m’
explain select * form emp where ename like ‘%m%’
4.只支持前置条件的模糊查询 ( 只有第一条 使用到索引)