MySQL性能优化——执行计划分析

举报
数据湖爱好者 发表于 2021/05/20 10:36:36 2021/05/20
【摘要】 一、执行计划是什么,有什么作用SQL语句在数据库中,经过SQL解析器时,解析器会分析SQL语句,并根据索引等信息,制定数据查询的步骤顺序。我们可以通过在SQL语句前添加 EXPLAIN关键字来输出执行计划。通过分析执行计划,我们可以了解到:SQL的索引使用情况。连接查询的执行顺序。查询扫描的数据函数。二、SQL执行顺序分析在了解执行计划之前,首先要清楚数据库SQL的执行顺序。SQL书写顺序:...

一、执行计划是什么,有什么作用

SQL语句在数据库中,经过SQL解析器时,解析器会分析SQL语句,并根据索引等信息,制定数据查询的步骤顺序。我们可以通过在SQL语句前添加 EXPLAIN关键字来输出执行计划。

通过分析执行计划,我们可以了解到:

  • SQL的索引使用情况。

  • 连接查询的执行顺序。

  • 查询扫描的数据函数。

二、SQL执行顺序分析

在了解执行计划之前,首先要清楚数据库SQL的执行顺序。

  • SQL书写顺序: SELECT ··· FROM ··· JOIN ··· ON ··· WHERE ··· GROUP BY ··· HAVING ··· ORDER BY ··· LIMIT [OFFSET]
  • SQL执行顺序: FROM ··· JOIN ··· ON ···WHERE ··· GROUP BY ··· HAVING ··· SELECT ··· ORDER BY ··· LIMIT

三、SQL执行计划详细分析

image-20210519170025913

执行计划可能存在多行,每一行代表对一个数据库对象的操作,下面对每个参数进行解析。

1、ID

  • ID列中如果为一组数字,表示执行SELECT语句的顺序;如果为NULL,则说明这一行数据是由另外两个SQL语句进行 UNION操作后产生的结果集
  • ID值相同时,说明SQL执行顺序是按照显示的从上至下执行的
  • ID值不同时,ID值越大代表优先级越高,则越先被执行

image-20210519170025913

​ 按照上述规则分析上图,我们可以看出,因为只有一个SELECT,索引两条数据ID相同,执行顺序就是先上面的表a,再执行下面的表b。MySQL优化器会根据表中的索引的统计信息来调整表关联的实际顺序。

2. SELECT_TYPE 查询类型

值 含义
SIMPLE 不包含子查询或是UNION操作的查询
PRIMARY 查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY
SUBQUERY SELECT 列表中的子查询
DEPENDENT SUBQUERY 依赖外部结果的子查询
UNION Union操作的第二个或是之后的查询的值为union
DEPENDENT UNION 当UNION作为子查询时,第二或是第二个后的查询的select_type值
UNION RESULT UNION产生的结果集
DERIVED 出现在FROM子句中的子查询

3. TABLE 表

包含以下几种结果:

  • 输出的数据行所在表的名称,如果表取了别名,则显示的是别名
  • <union M,N>: 由ID为M,N查询union产生的结果集
  • <derived N> or <subquery N> :由ID为N的查询产生的结果

4. PARTITIONS 分区

  • 查询匹配的记录来自哪一个分区
  • 对于分区表,显示查询的分区ID
  • 对于非分区表,显示为NULL

5. TYPE 执行类型

按性能从高至低排列如下:

值 含义
system 这是const联接类型的一个特例,当查询的表只有一行时使用
const 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式
eq_ref 唯一索引或主键索引查询,对应每个索引键,表中只有一条记录与之匹配
ref 非唯一索引查找,返回匹配某个单独值的所有行
ref_or_null 类似于ref类型的查询,但是附加了对NULL值列的查询
index_merge 该联接类型表示使用了索引合并优化方法
range 索引范围扫描,常见于between、>、<这样的查询条件
index FULL index Scan 全索引扫描,同ALL的区别是,遍历的是索引树
ALL FULL TABLE Scan 全表扫描,这是效率最差的联接方式

6. POSSIBLE_KEYS 可用索引

  • 指出MySQL能使用哪些索引来优化查询
  • 查询列所涉及到的列上的索引都会被列出,但不一定会被使用

7. KEY 使用索引

  • 查询优化器优化查询实际所使用的索引
  • 如果表中没有可用的索引,则显示为NULL
  • 如果查询使用了覆盖索引,则该索引仅出现在Key列中

8. KEY_LEN 索引长度

显示MySQL索引所使用的字节数,在联合索引中如果有3列,假如3列字段总长度为100个字节,Key_len显示的可能会小于100字节,比如30字节,这就说明在查询过程中没有使用到联合索引的所有列,只是利用到了前面的一列或2列

  • 表示索引字段的最大可能长度
  • Key_len的长度由字段定义计算而来,并非数据的实际长度

9. REF

  • 表示当前表在利用Key列记录中的索引进行查询时所用到的列或常量

10. ROWS

  • 表示MySQL通过索引的统计信息,估算出来的所需读取的行数(关联查询时,显示的是每次嵌套查询时所需要的行数)
  • ROWS值的大小是个统计抽样结果,并不十分准确

11. FILTERED

  • 表示返回结果的行数占需读取行数的百分比
  • Filtered列的值越大越好(值越大,表明实际读取的行数与所需要返回的行数越接近)
  • Filtered列的值依赖统计信息,所以同样也不是十分准确,只是一个参考值

12. EXTRA 附加信息

包含MySQL如何执行查询的附加信息

值 含义
Distinct 优化distinct操作,在找到第一个匹配的元素后即停止查找
Not exists 使用not exists来优化查询
Using filesort 使用额外操作进行排序,通常会出现在order by或group by查询中
Using index 使用了覆盖索引进行查询
Using temporary MySQL需要使用临时表来处理查询,常见于排序,子查询,和分组查询
Using where 需要在MySQL服务器层使用WHERE条件来过滤数据
select tables optimized away 直接通过索引来获得数据,不用访问表,这种情况通常效率是最高的
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。