十五、执行计划(explain)
1、命令格式
explain 查询语句
2、命令作用
- 展示当前查询得到结果是否通过索引来进行定位
- DBA(数据库管理员)通过执行计划了解在本次查询过程,是否使用预先创建好的素引
3、执行计划对于查询语句执行效率判断
-
在执行计划中,通过type属性展示查询语句执行效率
-
执行效率分类(type列):[慢—>快]
-
All:where对表文件所有数据行进行遍历,才得到了查询结果
- 这种级别查询语句,随着数据行增加导致执行速度大幅度降低
- 对于DBA(数据库管理员)来说,应当极力避免这种级别的查询
-
index:where对表文件所有数据行进行遍历,只不过在 select抓取字段内容时,从索引中抓取
-
这种级别虽然在抓取数据速度有所提升,但依然面临随着数据行增加导致执行速度大幅降低
-
对于DBA(数据库管理员)来说,应当极力避免这种级别的查询
-
explain select * from emp; -- type:all -- 给表emp的ename字段创建一个索引 create index ename_index on emp(ename); -- type:index,此时对于查询速度提升实际上是非常微小的 explain select ename from emp;
-
-
range:where不会对表文件数据行进行遍历,而是直接从索引得到定位的数据行行数,这将大幅度提升查询效率
-
这是DBA(数据库管理员)进行SQL优化时要保证的最低级别
-
但是这种级别存在不稳定性,当字段发生变化时会导致索引失效
-
-- type:all;rows:14(总14条) explain select * from emp where sal<=1000; -- 给表emp的sal字段创建一个索引 create index sal_index on emp(sal); -- 在此执行第一条查询语句,type:range;rows:2(总14条) explain select * from emp where sal<=1000;
-
MySql服务器如果发现从索引得到数据行行数达到了表文件总行数1/3(新版本2/3)时,此时考虑运行成本问题就会放弃使用索引
-
-- sal<=1250的数据超过了总数据的1/3(总14条) -- 此时type:all;rows:14 explain select from emp where sal<=1250;
-
-
-
ref:where不会对表文件数据行进行遍历,而是直接从索引得到定位的数据行行数,同时在这种情况根据定位条件一次只能得到一个数据行,属于比较稳定执行效率。对于DBA(数据库管理员)来说,这是要努力达到的优化程度
-
-- 确保ename='smith'只有一个!这时type:ref;rows:1 explain select * from emp where ename='smith';
-
-
const:根据主键字段上的索引进行定位,执行效率最快。但是在实际使用过程中,几乎不会被用到
-
-- empno是主键;这时type:const;rows:1 explain select * from emp where empno=7369;
-
-