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日

相关文章

  • MySQL 存储过程的基本用法介绍

    MySQL 存储过程是一组预先编译的 SQL 语句,被存储在数据库服务器中,可用于特定的数据操作和数据处理任务,支持传递参数和返回多值。本篇攻略将对 MySQL 存储过程的基本用法进行详细介绍。 1. 创建存储过程 在创建存储过程之前,首先需要选择一个合适的存储引擎。MySQL 提供了多种存储引擎,其中常用的为 InnoDB 和 MyISAM。创建存储过程的…

    database 2023年5月22日
    00
  • Oracle 处理json数据的方法

    下面我将为您详细讲解如何在Oracle中处理JSON数据。 1. 创建具有JSON数据类型的表 在Oracle 12c及以上版本中,可以通过创建具有JSON数据类型的列来存储JSON数据。我们首先需要使用以下代码创建一个新表,其中包含JSON数据列: CREATE TABLE my_table (id NUMBER, data JSON); 2. 插入JSO…

    database 2023年5月21日
    00
  • PHP实现页面静态化的超简单方法

    下面我会为您详细讲解“PHP实现页面静态化的超简单方法”的完整攻略。这份攻略主要会涉及PHP文件缓存、文件读写等知识点,但是相信您只要按照下面的步骤操作,就一定能够顺利完成页面静态化的过程。 什么是页面静态化 页面静态化指的是,把动态页面变成静态页面,让用户访问静态页面,实现页面高效的访问和提升网站性能的目的。 实现页面静态化的方法 实现页面静态化的方法有很…

    database 2023年5月19日
    00
  • CentOS6.5下Redis安装与配置详细步骤

    以下是CentOS6.5下Redis安装与配置的详细步骤攻略: 安装Redis 安装epel-release仓库: shell sudo yum install epel-release 安装Redis: shell sudo yum install redis 安装过程中会自动安装依赖库,需要输入“Y”确认安装,等待一段时间即可完成安装。 配置Redis …

    database 2023年5月22日
    00
  • php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)

    下面我会详细讲解如何使用PHP和MySQL查询当天、本周、本月的数据,并提供两个实例说明。 查询当天数据 要查询当天的数据,需要先获取当前时间并格式化。可以使用PHP的date函数来实现: $date = date(‘Y-m-d’); // 获取当前日期,格式为"年-月-日" 然后就可以使用MySQL的WHERE子句筛选出符合条件的数据,…

    database 2023年5月22日
    00
  • Android开发笔记之: 数据存储方式详解

    Android开发笔记之: 数据存储方式详解 一、前言 在Android应用开发中,数据是非常重要的一个方面,Android为开发者们提供了多种数据存储方式。本篇博客将系统全面介绍Android数据存储方式,以供Android开发者们快速了解数据存储的方法、应用场景,并可快速将其应用到实践中。 二、Android数据存储方式 1. 文件存储 文件存储是最常见…

    database 2023年5月22日
    00
  • mongodb字段值自增长实现代码

    下面是关于 MongoDB 字段值自增实现的完整攻略: 1. 使用文档中的字段来实现自增长 要实现 MongoDB 字段值自增长的功能,我们可以使用相应文档中的字段来实现。一般来说,我们可以选择将字段值设为自增长的数值,具体步骤如下: 首先,你需要确定需要自增长的字段的名称,一般选择使用 count 字段来实现。 随后,在插入文档时,你需要将这个字段的默认值…

    database 2023年5月22日
    00
  • MySQL如何导入SQL数据库的实战举例

    下面是MySQL如何导入SQL数据库的完整攻略,包含以下步骤: 步骤一:准备SQL文件 将需要导入的SQL数据库文件准备好,比如名为“example.sql”的文件。 步骤二:登录MySQL 在命令行窗口中输入以下命令登录MySQL服务器: mysql -u用户名 -p密码 其中,“用户名”和“密码”分别为你的MySQL登录名和密码。 步骤三:创建数据库 在…

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