MySQL EXPLAIN输出列的详细解释

下面详细讲解一下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技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 敏捷框架和极限编程的区别

    敏捷框架和极限编程都是敏捷开发方法中的一种,它们有很多相似之处,但也有一些明显的区别。 敏捷框架 敏捷框架是一个大型的,完整的敏捷方法,它包含了很多个不同的过程和实践。例如Scrum、Kanban、XP等,在敏捷框架中,每个团队都可以选择最适合自己的方法,不同的方法可以有不同的实践,但都遵循了敏捷的原则和价值观,主要体现在以下几个方面: 持续交付 敏捷方法强…

    database 2023年3月27日
    00
  • AnzoGraph和MongoDB的区别

    AnzoGraph和MongoDB是两种不同类型的数据库管理系统,它们在数据存储、查询、处理等方面有很大差异。 首先,AnzoGraph是一种图数据库,广泛应用于语义网、知识图谱等领域,能够处理大量的图数据。MongoDB是一种文档型数据库,数据以文档的形式存储。 其次,在数据存储方面,AnzoGraph采用的是三元组模型,即以主语、谓语、宾语的形式存储数据…

    database 2023年3月27日
    00
  • Oracle数据库逻辑备份的SH文件

    下面是Oracle数据库逻辑备份的SH文件的完整攻略。 一、什么是Oracle数据库逻辑备份 Oracle数据库逻辑备份是指将数据库的数据通过SQL语句等方式进行备份,通常备份文件是一个文本文件,比如SQL语句、数据导出文件等。 二、为什么需要SH文件 为了方便备份,在Linux系统中,我们可以通过编写SH脚本来自动备份数据库。SH文件可以自动化调用备份命令…

    database 2023年5月21日
    00
  • 详解MySQL DISTINCT:过滤重复数据

    MySQL DISTINCT是用来过滤重复数据的关键字。它对于需要在SELECT语句中查询不同值的情况非常有用。 使用MySQL DISTINCT可以根据一个或多个列选择唯一的值。如果SELECT语句中包含多个列,DISTINCT将根据这些列的组合选择唯一的组合。 语法 SELECT DISTINCT column_name(s) FROM table_na…

    MySQL 2023年3月9日
    00
  • ubuntu16.04彻底卸载mysql并且重新安装mysql

    首先删除mysql: sudo apt-get remove mysql-* dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P 清理完毕: dpkg: error: –purge needs at least one package name argument Type dpkg –help f…

    MySQL 2023年4月13日
    00
  • php 链接不上 mysql数据库,不是扩展的问题,也不是数据库的问题

    提示信息 [24-Nov-2009 23:46:36] PHP Warning:  mysql_connect() [<a href=’function.mysql-connect’>function.mysql-connect</a>]: [2002] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试 (trying…

    MySQL 2023年4月13日
    00
  • ORACLE出现错误1033和错误ORA-00600的解决方法

    ORACLE出现错误1033和错误ORA-00600的解决方法 错误1033的解决方法 当我们在使用Oracle数据库的时候,可能会遇到错误1033。错误1033的提示信息如下所示: ORA-01033: ORACLE initialization or shutdown in progress 这个错误信息常常在连接数据库的时候出现。出现这个错误的原因是因…

    database 2023年5月19日
    00
  • python连接MySQL、MongoDB、Redis、memcache等数据库的方法

    连接MySQL数据库的方法: 首先需要安装mysql-connector-python这个Python库,可以使用pip命令进行安装。 然后在Python代码中导入库: python import mysql.connector 使用mysql.connector.connect()方法连接到数据库: python mydb = mysql.connecto…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部