做SQL优化时,在MySQL数据库中,经常需要先看一条语句的执行计划,通过查看执行计划,有助于对我们的SQL语句以及表结构的一些优化。
EXPLAIN SQL
-- 标准输出
EXPLAIN SELECT * FROM region WHERE id = 110000;
-- JSON输出
EXPLAIN FORMAT= JSON SELECT * FROM region r WHERE r.`id` = 110000;| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | region | (NULL) | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.00 | (NULL) |
| column | main |
|---|---|
id |
标识符 |
select_type |
查询的类型,有下述选项:SIMPLE:简单的查询,不使用union或子查询PRIMARY:最外层的查询UNIOS:UNION中的第二个或后面的SELECT语句DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询UNION RESULT:UNION的结果SUBQUERY:子查询中的第一个SELECTDEPENDENT SUBQUERY:子查询中的第一次SELECT,取决于外部查询DERIVED:派生的表MATERIALIZED:物化子查询UNCACHEABLE SUBQUERY:无法缓存其结果的子查询,必须为外部查询的每一行重新计算UNCACHEABLE UNION:在属于不可缓存子查询的UNION中选择的第二个或更高版本 (请参见UNCACHEABLE SUBQUERY) |
table |
输出的行所引用的表的名称 |
partitions |
匹配的分区 |
type |
联接类型,有下述选项:system:该表只有一行(=系统表),这是const联接类型的一个特例。const:该表最多只有一个匹配的行, 在查询开始时读取该行。因为只有一行, 所以优化器的其余部分可以将该行中的列中的值视为常量。const速度非常快, 因为它们只读取一次。通常查询条件使用了唯一索引。eq_ref:对于上一表中的每个行组合, 从此表中读取一行。除system、const这是最好的联接类型。可作用于运算符=ref:对于上一表中的每个行组合,都将从此表中读取具有匹配索引值的所有行。 可作用于运算符=、<=>fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引。ref_or_null:与ref方法类似,只是增加了NULL值的比较。index_merge:此联接类型表示使用了 "索引合并优化"。在这种情况下, 输出行中的列包含使用的索引列表, 并包含所使用索引的最长键部分的列表。unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值。index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。range:索引范围扫描,常见于使用= 、>、<、<>、>=、<=、IS NULL、BETWEEN、IN、LIKE等运算符的查询中。index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。all:全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。 |
possible_keys |
可能选择的索引 |
key |
实际选择的索引 |
key_len |
所选索引的长度 |
ref |
与索引相比的列 |
rows |
扫描的行 |
filtered |
按表条件筛选的行的百分比 |
Extra |
更多信息,有几十种,常见的如下:Using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中。 Using index condition:通过访问索引元组并首先对其进行测试来确定是否读取完整表行, 可以读取表。Using index:从表中检索列信息时只使用索引树中的信息, 而不必执行额外的搜索来读取实际行。Distinct:使用了distinc关键字,在找到第一个匹配行之后, 它将停止搜索当前行组合的更多行。更多信息 |
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.00"
},
"table": {
"table_name": "r",
"access_type": "const",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"id"
],
"key_length": "8",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.00",
"eval_cost": "0.20",
"prefix_cost": "0.00",
"data_read_per_join": "280"
},
"used_columns": [
"id",
"parent_id",
"name",
"level",
"leaf"
]
}
}
}JSON格式化输出与标准输出的对应,请参照文档。