MySQL EXPLAIN输出列的详细解释

yizhihongxing

下面详细讲解一下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日

相关文章

  • 关于redis在cluster模式化下的 分布式锁的探索

    背景        redis作为一个内存数据库,在分布式的服务的大环境下,占的比重越来越大啦,下面我们和大家一起探讨一下如何使用redis实现一个分布式锁  说明       一个分布式锁至少要满足下面几个条件      1:互斥性               多个客户端竞争的时候,只能有一个客户端能获取锁       2:安全性             …

    Redis 2023年4月16日
    00
  • Redis 根据key获取所有 HashKey

    前一段时间,做项目的时候遇到一个问题,就是如果缓存的时候使用 HashKey,那么如何能通过key获取所有的HashKey的值,通过百度发现没有直接答案,没办法就看了下redis的使用,通过查找发现有“entries”方法可以做到,接下来我们看具体代码。 import java.util.List; /** * @Package com.ywtg.commo…

    Redis 2023年4月11日
    00
  • 浅谈mysql 树形结构表设计与优化

    那么现在我会给你提供一个关于 “浅谈mysql 树形结构表设计与优化”的完整攻略。 浅谈mysql 树形结构表设计与优化 一、什么是树形结构表? “树形结构表”指的是数据库中一种特殊的数据结构,是一种可以用来表示层级关系的表结构。 举例来说,一些电商网站的商品分类就是用树形结构来进行表示的。 二、树形结构表的设计与原理 1.设计范式 树形结构表的设计需要考虑…

    database 2023年5月19日
    00
  • 如何优化SQL语句(全)

    以下是如何优化 SQL 语句的完整攻略: 1. 确定优化目标和范围 在进行 SQL 优化之前,必须先确定优化的目标和优化的范围。目标是什么?但凡是涉及查询性能的问题,往往都是执行效率低下。如果你能通过优化 SQL 减少了查询所需时间,或者缩短了执行查询所需时间的界面响应时间,那么目标就可以算是达成了。而范围则是只考虑 SQL 查询的优化,也就是针对 SELE…

    database 2023年5月19日
    00
  • Redis 密码设置和查看密码

      redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。    1、初始化Redis密码:    在配置文件中有个参数: requirepass  这个就是配置redis访问密码的参数;    比如 requirepass 123456;    (Ps:需重启Redis才能生效)    redis…

    Redis 2023年4月12日
    00
  • PHP无法访问远程mysql的问题分析及解决

    如果PHP无法访问远程mysql数据库,其原因可能是以下几个方面: 1.数据库防火墙设置不当。此时需要检查mysql数据库的安全组规则是否设置为允许外网访问mysql数据库,并且要检查服务器的防火墙是否已经开放mysql的端口。 2.远程访问权限设置不正确。需要检查mysql用户账户的权限是否设置为允许远程访问数据库,具体方式为在mysql服务器上执行命令:…

    database 2023年5月22日
    00
  • seata docker 高可用部署的详细介绍

    Seata Docker 高可用部署的详细介绍 简介 Seata是一个开源的分布式事务解决方案,它提供了高可用、高性能和易于使用的分布式事务服务。 Docker是一种容器化技术,可以实现快速部署和扩容。Seata提供了Docker镜像,可以便捷地部署和运行Seata。 本文将介绍如何使用Docker部署Seata高可用环境,并且提供两个示例以说明具体的部署过…

    database 2023年5月18日
    00
  • mysql查询慢的原因和解决方案

    关于Mysql查询慢的原因和解决方案,下面我为大家准备了一份完整攻略。 1. 原因分析 Mysql查询慢主要有以下几个方面的原因: 1.1 索引设计不合理 索引是数据库查询的核心,不合理的索引设计会导致查询速度变慢。比如说,如果没有为一个超大表的关键字段设置索引,那么查询这个表的时候就会非常慢。 1.2 SQL语句不合理 SQL语句中的某些操作可能会导致查询…

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