五、Explain 用法
在公司中,编写SQL语句,首先要先将需求写出来,不要管优化的事儿。运行一段时间后,查找出来SQL效率不高的语句,单独分析。数据库都有一个功能,叫做慢查询。可以开启慢查询,它就会在运行过程中,将执行速度比较慢的SQL语句给你展示出来,这个时候再针对这样的SQL语句进行分析,看慢在了哪里?
如何分析呢? 使用 Explain 的关键字。
explain select * from tbl_dept where id = 1;
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | tbl_dept | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
学习的是如何看懂这个分析的结果,这个结果中有10个关键字。
1、id (掌握)
- id: select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序;
- id如果相同,可以认为是一组,从上往下顺序执行;
- 在所有组中,id值越大,优先级越高,越先执行 。
2、select_type (了解)
查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询
- SIMPLE:简单的 select 查询,查询中不包含子查询或者UNION
- PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
- SUBQUERY:在SELECT或WHERE列表中包含了子查询
- DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询, 把结果放在临时表里。
- UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
- UNION RESULT:从UNION表获取结果的SELECT
3、table (了解)
- 显示这一行的数据是关于哪张表的
- 如果是衍生表,一般是derivered+id作为表名。
4、type 非常重要的指标
这个指标是说明我们这个SQL是好还是坏的一个非常重要的指标;
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery >