MySQL性能优化——Explain使用分析

执行计划是分析SQL性能的利器 , 目前互联网最常用的关系型数据库是MySQL , 接下来结合自己对MySQL的理解和实践经验谈谈MySQL执行计划的使用 。
简介
MySQL提供了explain语法 , 使用非常简单 , 例:EXPLAIN SELECT * from user_info WHERE id =2;
输出格式如下:
MySQL性能优化——Explain使用分析文章插图
执行结果
各列的含义:

  • id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
  • select_type: SELECT 查询的类型.
  • table: 查询的是哪个表
  • type: join 类型
  • possible_keys: 此次查询中可能选用的索引
  • key: 此次查询中确切使用到了索引.
  • ref: 哪个字段或常数与 key 一起被使用
  • rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
  • filtered: 表示此查询条件所过滤的数据的百分比
  • extra: 额外的信息
针对几个重要属性 , 通过几个例子详细说明一下
id:select 的查询序号 , 包括一组数字 , 表示查询中执行了子句或操作的顺序 。
id的查询结果有3种情况
  • id相同 , 执行顺序自上而下

MySQL性能优化——Explain使用分析文章插图
执行结果
  • id不同 , 如果是子查询 , id序号会递增 , id值越大 , 越先被执行

MySQL性能优化——Explain使用分析文章插图
执行结果
  • id相同和不同同时存在 , id值越大 , 越先被执行 , id相同认为是同一组 , 自上而下执行 。 另外衍生=derived , 下图中在id=1时 , table显示的是derived2 , 指向id=2的表 , 即T3表的衍生表 。

MySQL性能优化——Explain使用分析文章插图
执行结果
select_type:表示查询的类型 , 取值如下:
  • SIMPLE:表示此查询不包含 UNION 查询或子查询
  • PRIMARY:表示此查询是最外层的查询
  • UNION:表示此查询是 UNION 的第二或随后的查询
  • DEPENDENT UNION:UNION 中的第二个或后面的查询语句, 取决于外面的查询
  • UNION RESULT:UNION 的结果
  • SUBQUERY:子查询中的第一个 SELECT
  • DEPENDENT SUBQUERY:子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.
最常见的就是SIMPLE类型了 , 比如上图的展示 。
如果使用了union查询 , EXPLAIN (SELECT * FROM user_info WHERE id IN (1, 2, 3)) UNION (SELECT * FROM user_info WHERE id IN (3, 4, 5));结果如下:
MySQL性能优化——Explain使用分析文章插图
执行结果
type:此属性比较重要 , 它提供了判断查询效率是否高效的依据 。
常用取值:
  • system, 表中只有一条数据 。
  • const , 针对主键或者唯一索引的等值查询 , 最多返回一行数据 , const查询效率高 。
  • eq_ref , 多表join查询 , 使用主键或者唯一索引进行关联 , 通常使用“=”进行关联 , 查询效率高 。 explain SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id;

MySQL性能优化——Explain使用分析文章插图
执行结果