下面详细讲解一下MySQL EXPLAIN输出列的详细解释。
1. EXPLAIN的作用
在MySQL中,通过使用EXPLAIN命令可以分析查询语句的执行计划,从而提高SQL语句的执行效率。EXPLAIN命令会显示MySQL如何处理查询语句,可以帮助我们理解查询语句执行的具体过程和优化查询语句。
2. EXPLAIN的输出列
下面是展示EXPLAIN输出列的含义:
- id:查询的标识符,对于一个查询来说,每个SELECT、INSERT、UPDATE、DELETE语句都对应一个唯一的标识符。
- select_type:查询类型,表示MySQL对于查询的优化程度,这是查询性能评估的关键信息之一。常见的查询类型有:SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)、DERIVED(衍生表查询)、UNION(联合查询)、UNION RESULT(联合查询的结果集)、DEPENDENT UNION(依赖联合)、UNION DISTINCT(独立联合)、DEPENDENT SUBQUERY(依赖子查询)、UNCACHEABLE SUBQUERY(无法缓存的子查询)。
- type:连接类型,表示MySQL在表之间进行联接时所采用的连接类型,这是评估查询性能的另一个重要指标。通常有:const(常量表),eq_ref(唯一性索引)、ref(非唯一性索引)、fulltext(全文索引)和system(仅一条记录,这是const类型的特例)。
- possible_keys:可能使用的索引,指出在当前查询场景下,MySQL可能选择使用的索引列表。
- key:实际使用的索引,具体使用的是哪个索引名。如果为NULL,则表示没有使用索引,需要优化。
- key_len:索引的长度,代表MySQL使用的索引的长度,通常是字段长度及索引类型长度的总和。
- ref:列与索引匹配的情况描述。如果ref显示为const,则表示使用了常量。如果ref显示为NULL,则表示没有匹配索引。
- rows:估计的查询结果行数,表示MySQL在执行查询时,估计的所需扫描的行数。
- filtered:过滤器,表示数据检索出来的所有行,按行过滤得到的结果行的百分比。如filtered=10%表示,查询语句过滤掉90%的行,只返回10%的数据。
- Extra:额外的信息,包括MySQL的许多内部细节,如哪些索引被使用,是否使用临时表和文件排序等。
3. EXPLAIN的示例
假设有一个查询语句:
SELECT * FROM orders WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31' AND customer_id = 123;
执行EXPLAIN命令,可得到查询语句的执行计划。输出结果如下:
+----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
| 1 | SIMPLE | orders | NULL | ALL | NULL | NULL | NULL | NULL | 1841 | 100.00 | Using where |
+----+-------------+--------+------------+------+---------------+-------------+---------+-------+------+----------+--------------------------+
以上结果表明:
- id=1:查询语句的唯一标识符为1。
- select_type=SIMPLE:查询语句是一个简单查询。
- table=orders:查询的表名为orders。
- type=ALL:使用全表扫描,表示MySQL需要扫描整个表才能找到符合条件的记录,需要优化。
- rows=1841:MySQL在执行查询时,估计需要扫描的行数为1841行。
- filtered=100.00:过滤器为100%,表示查询没有过滤出不符合条件的数据。
- Extra=Using where:表示MySQL使用了WHERE子句进行查询。
假设有另一个查询语句:
SELECT o.order_id, COUNT(oi.order_item_id) AS item_count, SUM(oi.order_item_price) AS order_price
FROM orders o JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.order_date BETWEEN '2020-01-01' AND '2020-12-31' AND o.customer_id = 123
GROUP BY o.order_id
ORDER BY o.order_date DESC;
执行EXPLAIN命令,可得到查询语句的执行计划。输出结果如下:
+----+-------------+------------+------------+--------+---------------+---------+---------+-----------------------------------+------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+--------+---------------+---------+---------+-----------------------------------+------+----------+-----------------------------------------------------------+
| 1 | SIMPLE | o | NULL | ref | PRIMARY | PRIMARY | 4 | const,const | 168 | 10.00 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | oi | NULL | ref | order_items | PRIMARY | 4 | sakila.o.order_id | 9 | 100.00 | Using index |
+----+-------------+------------+------------+--------+---------------+---------+---------+-----------------------------------+------+----------+-----------------------------------------------------------+
以上结果表明:
- id=1:查询语句的唯一标识符为1。
- select_type=SIMPLE:查询语句是一个简单查询。
- table=o:查询的主表为orders。
- type=ref:表示使用了索引。
- rows=168:MySQL在执行查询时,估计需要扫描的行数为168行。
- filtered=10.00:过滤器为10%,表示查询过滤掉了90%的行。
- Extra=Using index; Using temporary; Using filesort:表示MySQL使用了索引、临时表和文件排序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL EXPLAIN输出列的详细解释 - Python技术站