1. explain 执行计划,
通过执行计划可以了解MySQL
选择了什么执行计划来执行SQL
,并且SQL
的执行过程到此结束,即并不会真正的往下交给执行器去执行;最终的目的还是优化MySQL
的性能。
我们通过EXPLAIN
语句来查看查看MySQL
如何执行语句的信息;EXPLAIN
语句可以查看SELECT
、DELETE
、INSERT
、REPLACT
和UPDATE
语句。
mysql> explain select * from city where id <3;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | city | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 2 | 100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.05 sec)
字段说明:
字段 | 描述 | 备注 |
| 该SELECT标识符 | |
| 该SELECT类型 | |
| 输出结果的表 | |
| 匹配的分区 | |
| 表的连接类型 | |
| 查询时可能的索引选择 | 只是有可能选择的索引,但是也能最后选择的索引不在该字段中 |
| 实际选择的索引 | 需要重点了解的 |
| 所选 | |
| 列与索引的比较 | |
| 表示 |
|
| 按表条件过滤的行百分比 | |
| 执行情况的附加信息 | 需要重点了解的 |
2. type表的连接类型说明:
该type
列输出介绍如何联接表,接下来列举常见联接类型,性能从最佳到最差排序:
system
const
首先,system
是最优的,它的意思是表只有一行(但效果我没演示出来),是const
类型的一种特例,所以就把这两个列一块了。
eq_ref
ON
UNIQUE NOT NULL,PRIMARY KEY
eq_ref
ref
出现的条件是: 查找条件列使用了索引但不是PRIMARY KEY
和UNIQUE KEY
。其意思就是虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。
fulltext
ref_or_null
index_merge
unique_subquery
index_subquery
range
是基于索引的范围扫描,包含>,<,>=,<=,!=,like,in,not in,or,!=,not in
的情况会走range
;出现range
的条件是:查询条件列是非PRIMARY KEY
和UNIUQE KEY
的索引列,也就是说条件列使用了索引,但该索引列的值并不是唯一的,这样的话,即使很快的找到了第一条数据,但仍然不能停止的在指定的范围内继续找。
index
全索引扫描,根据条件扫描索引然后再回表查询数据, 因为索引有序所以要比all效率高那么一奶奶了.
ALL
全表扫描,效果最差,什么情况下会走ALL? 1.查询字段是非索引字段, 2.查询条件中包含!= not in like
小结
执行计划算是MySQL
优化部分的内容了,想要弄懂首先要对SQL
语句非常熟练,并且也要非常熟练索引相关的知识,还需要熟悉存储引擎,因为有些情况是基于指定存储引擎下的结果;除此之外,想要弄懂Extra
栏,需要同时结合表的索引情况、查询语句、优化器(MySQL
会优化我们的SQL
)、以及EXPLAIN
的type
栏和rows
栏等综合分析出现的各种情况。
这里单独对Extra
的几种情况做下总结:
-
Using index
:表示使用索引,如果只有Using index
,表示使用覆盖索引返回数据而没有回表查询的操作。 -
Using index;Using where
:说明在使用索引的基础上还需要回表查询记录,可以考虑只返回指定的字段和建立联合索引来尝试避免回表查询情况。 -
Using index condition
:说明会先根据走索引过滤结果,然后再根据其他子句的情况做回表查询操作。 -
Using where
:表示在查询中很可能出现了回表查询的情况,可以观察是否加个索引来优化。 -
Using temporary
:表示MySQL
需要创建临时表来保存临时结果;通常出现在包含不同列的GROUP BY
和ORDER BY
子句时,另外也时常跟Using filesort
一起出现。 -
Using filesort
:表示在使用索引之外,还需要额外的排序操作,也可以根据具体情况添加索引来解决。