SQL调优之Explain关键字详解

explAIn关键字可以模拟优化器执行 SQL 查询语句 , 从而知道 MySQL 是如何处理 SQL 语句的 。分析查询语句或表结构的性能瓶颈 。执行语句:explain + SQL语句 。表头信息如下:

SQL调优之Explain关键字详解

文章插图
【SQL调优之Explain关键字详解】explain各个字段代表的意思
  • id :select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 。
  • select_type :查询类型 或者是 其他操作类型 。
  • table :正在访问哪个表 。
  • partitions :匹配的分区 。
  • type :访问的类型 。
  • possible_keys :显示可能应用在这张表中的索引,一个或多个 , 但不一定实际使用到 。
  • key :实际使用到的索引,如果为NULL,则没有使用索引 。
  • key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度 。
  • ref :显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值 。
  • rows :根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数 。
  • filtered :查询的表行占表的百分比 。
  • Extra :包含不适合在其它列中显示但十分重要的额外信息 。
ID 字段select 查询的序列号 , 包含一组数字,表示查询中执行 select 子句或操作表的顺序 。三种情况:
id 相同: 执行顺序由上而下:
explain select t2.* from t1,t2,t3 where t1.id = t2.id and t1.id = t3.id and t1.other_column = '';
  • 1.

SQL调优之Explain关键字详解

文章插图
id 不同: 如果是子查询,id 序号会递增 , id 越大优先级越高 , 越先被执行 。
explain select t2.* from t2 where id = (select id from t1 where id = (select t3.id from t3 where t3.other_column = ''));
  • 1.

SQL调优之Explain关键字详解

文章插图
id 相同不同同时存在: id 如果相同 , 可以认为是一组 , 由上往下执行;在所有组里 id 越大 , 优先级越高,越先执行 。
explain select t2.* from (select t3.id from t3 where t3.other_column = '') s1,t2 where s1.id = t2.id;
  • 1.

SQL调优之Explain关键字详解

文章插图
select_type 字段主要用于区别普通查询、联合查询、子查询等的复杂程度 。
SIMPLE: 简单的 select 查询,查询中不包含子查询或者 UNION 。
PRIMARY: 查询中若包含任何复杂的自查询,最外层查询为 PRIMARY 。
SQL调优之Explain关键字详解

文章插图
SUBQUERY: 在 SELECT 或 WHERE 中包含子查询 。
UNCACHEABLE SUBQUERY:一个子查询的结果不能被缓存,必须重新评估外链接的第一行 。
DERIVED: 在 FROM 列表中包含的子查询被标记为 DERIVED(衍生)MySQL 会递归执行这些子查询,把结果放进临时表 。
SQL调优之Explain关键字详解

文章插图
UNION: 若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION,若 UNION 包含在 FROM 子句的子查询,则外层SELECT 将被标记为 DERIVED 。
UNION RESULT: 从 UNION表中获取结果的 SELECT 。
table字段显示这行数据是关于那张表
SQL调优之Explain关键字详解

文章插图
type字段首先说一下这个字段,要记住以下10个状态,(从左往右,越靠左边的越优秀)
NULL > system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL
  • 1.
NULLMySQL能够在优化阶段分解查询语句 , 在执行阶段用不着再访问表或索引 。存在这样一种情况 , 大家都知道索引是将数据在B+Tree中进行排序了 , 所以你的查询速率才这么高,那么B+树的最边上的叶子节点是不是要么是最大值要么是最小值?。考热荒愣贾?懒?,那MySQL比你更知道?。〉蹦阋?檠?畲笾祷蛘咦钚≈凳? ,MySQL会直接到你的索引得分叶子节点上直接拿,所以不用访问表或者索引 。


推荐阅读