mysql优化利器之explain使用介绍

MySQL 优化利器之 Explain 使用介绍

什么是 Explain ?

Explain 是 MySQL 内置的一个用于分析查询语句的工具,在分析查询语句时,我们可通过 Explain 得到一份详细的优化建议。

Explain 使用方法

Explain 的语法如下:

EXPLAIN [EXTENDED] SELECT * FROM 表名 WHERE 条件;

在上述语句中,EXTENDED关键字是可选的,当加上此关键字时,会会显示更多详细信息。

解读 Explain 结果

Explain 的结果会输出一些列的路线(rows)。每一列路线代表了一个查询的执行过程。下面是 Explain 结果中常见列的含义:

  • id:查询序列号,每个 SELECT 查询都有一个独立的、唯一的 id 。
  • select_type:查询类型,有以下几种类型:
  • SIMPLE:简单 SELECT 查询,不包括子查询或 UNION 查询。
  • PRIMARY :最外层的查询(主查询)。
  • UNION:UNION 中第二个或后面的查询语句。
  • DEPENDENT UNION:UNION 中第二个或后面的查询语句,依赖于外部查询的结果。
  • SUBQUERY:子查询中的第一个 SELECT。
  • DEPENDENT SUBQUERY:子查询中的第一个 SELECT,依赖于外部查询的结果。
  • DERIVED:派生表的 SELECT,包含在 FROM 子句内的子查询。
  • table:显示这一行的数据是关于哪张表的。
  • partitions:匹配到的分区表的信息,如果查询没使用分区表,则值为 NULL。
  • type:表连接类型或查询类型。
  • system:表只有一行记录(等同于 system 表),这是 const 类型的特例,平均来说,这个类型很少出现。
  • const:表中的一个记录的最大值能够匹配这个查询,这个类型通常出现于 primary key 或 unique 类型的索引中。
  • eq_ref:类似于 const,使用了索引,只有更高的查找速度。该类型通常出现在关联查询中。
  • ref:使用了非唯一性索引。
  • range:使用了索引,索引是用于查询某个范围值的。
  • index:全索引扫描,对于每一行都需要扫描整个索引,这个比全表扫描还慢,一般就是没用好索引。
  • all:全表扫描。
  • NULL:这个表示依赖于引擎,可能也表示 subquery (从属查询)中的第一个 select 或不包括在其他任何类型中。
  • possible_keys:查询时,可能会用到的索引。
  • key:实际用到的索引。
  • key_len:用到索引字段的长度。
  • ref:哪个字段或常量与 key 一起被使用。
  • rows:这个操作根据查询条件可能扫描到的表中行数,是一个估计值。
  • filtered:按照表统计信息估计的扫描行数所占的百分比。这个值是大约的,并不精确。
  • Extra:包含了 MySQL 在查询过程中的详细信息,通常会给出:

  • Using filesort:看到这个的时候,就意味着 MySQL 需要进行排序操作,这通常发生在查询中有 ORDER BY子句、GROUP BY 子句或者 DISTINCT 时。

  • Using temporary:出现这个说明 MySQL 需要使用一个临时表来存储中间结果。我的理解是:MySQL 需要将两个表的相关数据先汇总到一个临时表里,然后再进行后续的操作。

  • Using where:这个代表 MySQL 需要在获取存储引擎的数据后再进行一次筛选,也就是需要进行回表操作。

  • Using join buffer (Block Nested Loop) 说明使用的是Block Nested Loop 算法做Join 操作。前提是查询的左右表中都有符合关联条件的索引。

  • Using index:使用了覆盖索引(Covering Index),只访问了索引中的数据而没有通过索引去访问数据表。

Explain 实例说明

  1. 简单查询:
mysql> EXPLAIN SELECT * FROM users WHERE id = 1;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | users | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+

解读:

  • 表示此语句仅针对一个表进行,表名为 users。
  • type 为 const,表示是一个常量查询。
  • key 列包含 PRIMARY,表示这是针对主键的查询。

  • 多表关联查询:

mysql> EXPLAIN SELECT * FROM users AS u LEFT JOIN orders AS o ON u.id = o.user_id WHERE u.id = 1;
+----+-------------+-------+--------+---------------+---------+---------+-------------+------+----------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref         | rows | filtered | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | u     | const  | PRIMARY       | PRIMARY | 4       | const       |    1 |   100.00 | Using index |
|  1 | SIMPLE      | o     | ref    | user_id       | user_id | 4       | test.u.id   |    2 |   100.00 | Using index |
+----+-------------+-------+--------+---------------+---------+---------+-------------+------+----------+-------------+

解读:

  • 该 SQL 语句存在关联查询,包含两个表,users 和 orders。
  • MySQL 优先选用 users 表。
  • users 表使用 PRIMARY 关键字表示使用主键查询,使用的是 const 类型。
  • orders 表使用 user_id 的索引,表示使用了 ref 类型的查询。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql优化利器之explain使用介绍 - Python技术站

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

相关文章

  • 解决postgresql 数据库 update更新慢的原因

    解决 PostgreSQL 数据库 update 更新慢的原因可以从以下几个方面入手: 1. 确认索引是否存在 在进行更新时,若没有适当的索引,可能会导致扫描大量数据,从而增加更新的时间。因此,检查表所依赖的索引是否存在就显得尤为重要。 可以先使用 EXPLAIN 命令查看具体的查询计划,确认是否有使用合适的索引。若没有,可以使用 CREATE INDEX …

    database 2023年5月21日
    00
  • linux查看防火墙状态与开启关闭命令详解

    Linux查看防火墙状态与开启关闭命令详解 一、防火墙状态查看 1.1 iptables命令查看 在Linux系统中,我们可以通过iptables命令来查看防火墙状态。在终端输入以下命令: sudo iptables -L 即可查看默认防火墙规则列表。如果列表中没有特定规则,则表示系统防火墙是关闭的。否则,系统防火墙是开启的。 在查看时,我们通常需要几个参数…

    database 2023年5月22日
    00
  • hi 感恩节——Linux基础教程之mysql和php

    Hi 感恩节——Linux基础教程之Mysql和PHP 简介 本教程将介绍如何在Linux操作系统中安装、配置和使用Mysql和PHP,这是Web开发中必不可少的两个组件。本教程适合于已经熟悉Linux基础操作的人士。 Mysql安装和配置 安装Mysql 首先,检查系统是否已经安装了Mysql,可以通过以下命令来检查: which mysql 如果系统已经…

    database 2023年5月22日
    00
  • MySQL 和 SQLite 的区别

    MySQL和SQLite是两种常见的关系型数据库管理系统,它们有一些共同点,但也存在不少区别。下面详细讲解MySQL 和 SQLite 的区别。 MySQL 和 SQLite的简介 MySQL: MySQL是一种基于关系模型的数据库管理系统,它采用客户端/服务器架构,常用于大型应用和高并发场景。MySQL支持复杂的SQL查询和事务控制等功能,同时也支持多种语…

    database 2023年3月27日
    00
  • MySQL DBA教程:Mysql性能优化之缓存参数优化

    MySQL DBA教程:MySQL性能优化之缓存参数优化完整攻略 在进行 MySQL 性能优化时,缓存参数优化是一个非常重要的环节,通过合理的调整可以极大地提升 MySQL 数据库的执行效率。本文将从 MySQL 的缓存结构入手,详细讲解 MySQL 缓存参数的优化方法。 MySQL的缓存结构 在了解 MySQL 缓存参数优化方法之前,必须要先理解 MySQ…

    database 2023年5月19日
    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
  • IDEA连接MySQL数据库并执行SQL语句使用数据图文详解

    下面我来详细讲解一下“IDEA连接MySQL数据库并执行SQL语句使用数据图文详解”的完整攻略。 准备工作 首先,我们需要下载和安装 IntelliJ IDEA,以及 MySQL 数据库,可以从官网进行下载。 下载链接: IntelliJ IDEA:https://www.jetbrains.com/idea/download/ MySQL 数据库:http…

    database 2023年5月21日
    00
  • ThinkPHP中Session用法详解

    ThinkPHP中Session用法详解 什么是Session? Session是一种在Web服务器上跟踪用户会话的机制。它使用一个称为session ID的值来唯一标识每个用户的会话。这个session ID通常是存储在cookie或URL参数中。使用session,您可以存储在多个页面或请求之间保持用户数据,而无需以某种方式存储它们在客户端之外。 Thi…

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