MySQL调优执行计划

Posted EileenChang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL调优执行计划相关的知识,希望对你有一定的参考价值。


1 通过EXPLAIN优化查询

  借助explain语句,可以知道应该如何在表中创建索引,以便使用索引查找来加快查询语句的执行速度。还可以使用explain来检查优化器是否以最佳顺序加载表数据。总之,explain语句是SQL优化中必不可少的工具,具体可以参考MySQL官方文档。使用explain语句:

mysql> explain select emp_no, first_name, birth_date from employees where birth_date > '1964-06-02' limit 10;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299468 |    33.33 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

可以看到,执行计划中包含了如下信息:

ColumnJSON NameMeaning
idselect_idThe SELECT identifier
select_typeNoneThe SELECT type
tabletable_nameThe table for the output row
partitionspartitionsThe matching partitions
typeaccess_typeThe join type
possible_keyspossible_keysThe possible indexes to choose
keykeyThe index actually chosen
key_lenkey_lengthThe length of the chosen key
refrefThe columns compared to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraNoneAdditional information

2 查询序号id

  select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序。id有以下几种情况:

  • id相同,那么执行顺序从上到下。
  • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。
  • id相同和不同的,同时存在,相同的可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行。

3 访问类型type

  type显示的是访问类型,访问类型表示我是以何种方式去访问我们的数据,最容易想的是全表扫描,直接暴力的遍历一张表去寻找需要的数据,效率非常低。访问的类型有很多,效率从最好到最坏依次是:

  • NULL:无需访问表或者索引,比如获取一个索引列的最大值或最小值。
  • system/const:当查询最多匹配一行时,常出现于where条件是=的情况。system是const的一种特殊情况,既表本身只有一行数据的情况。
  • eq_ref:多表关联查询时,根据唯一非空索引进行查询的情况。
  • ref:多表查询时,根据非唯一非空索引进行查询的情况。
  • ref_or_null:对于某个字段即需要关联条件,也需要null值的情况下,查询优化器会选择这种访问方式。
  • index_merge:在查询过程中需要多个索引组合使用。
  • unique_subquery:该连接类型类似与index_subquery,使用的是唯一索引。
  • index_subquery:利用索引来关联子查询,不再扫描全表。
  • range:表示利用索引查询的时候限制了范围,在指定范围内进行查询,这样避免了index的全索引扫描,适用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()。
  • index:全索引扫描这个比all的效率要好,主要有两种情况,一种是当前的查询时覆盖索引,即我们需要的数据在索引中就可以索取,或者是使用了索引进行排序,这样就避免数据的重排序。
  • all:全表扫描,一般情况下出现这样的sql语句而且数据量比较大的话那么就需要进行优化。

4 possible_keys和key

  possible_keys显示可能应用在这张表中的索引,一个或多个,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
  key为实际使用的索引,如果为null,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

以上是关于MySQL调优执行计划的主要内容,如果未能解决你的问题,请参考以下文章

MySQL优化必备之执行计划explain,索引基本知识,索引数据结构推演

Mysql执行计划功能详解

一文讲清,MySQL的执行计划

一文讲清,MySQL的执行计划

MySQL 数据库调优

MySQL 数据库调优