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)
可以看到,执行计划中包含了如下信息:
Column | JSON Name | Meaning |
---|---|---|
id | select_id | The SELECT identifier |
select_type | None | The SELECT type |
table | table_name | The table for the output row |
partitions | partitions | The matching partitions |
type | access_type | The join type |
possible_keys | possible_keys | The possible indexes to choose |
key | key | The index actually chosen |
key_len | key_length | The length of the chosen key |
ref | ref | The columns compared to the index |
rows | rows | Estimate of rows to be examined |
filtered | filtered | Percentage of rows filtered by table condition |
Extra | None | Additional 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调优执行计划的主要内容,如果未能解决你的问题,请参考以下文章