mysql优化利器之explain使用介绍

yizhihongxing

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日

相关文章

  • SQL 计算两个日期之间相差的秒数、分钟数和小时数

    计算两个日期之间相差的秒数、分钟数和小时数可以使用DATEDIFF()函数和TIME_TO_SEC()函数来实现。 计算相差的秒数 计算两个日期之间相差的秒数可以使用以下SQL语句: SELECT TIMESTAMPDIFF(SECOND, ‘2022-01-01 12:00:00’, ‘2022-01-01 12:01:30’) AS diff_secon…

    database 2023年3月27日
    00
  • Python操作MySQL数据库的示例代码

    下面是使用Python操作MySQL数据库的示例代码的完整攻略。 准备工作 在Python中操作MySQL数据库,需要先安装MySQL数据库驱动程序。常用的有两个库:pymysql和mysql-connector-python。这里以pymysql为例,安装命令如下: pip install pymysql 连接MySQL数据库 首先,需要使用Python代…

    database 2023年5月22日
    00
  • oracle 函数

    什么是 Oracle 函数 Oracle 函数是一种用来封装可重复使用的SQL代码片段的方法。它向用户和应用程序提供了一种自定义的、可重用的函数库。 创建 Oracle 函数 可以使用以下语法来创建 Oracle 函数: CREATE [OR REPLACE] FUNCTION function_name [ (parameter_name [IN | OU…

    database 2023年5月21日
    00
  • SQL 提取姓名的首字母

    提取姓名的首字母,可以使用 SQL 函数 LEFT 和 SUBSTR 来实现。 在姓名列中,首先需要使用 LEFT 函数获取姓名的第一个字符,然后使用 UPPER 函数将该字符转换为大写,最终得到姓名的首字母。 以下是两个示例: 示例一 假设有一个名为 users 的数据表,其中有一个名为 name 的列,存储着用户的姓名。 首先使用以下查询语句从 user…

    database 2023年3月27日
    00
  • SQL – GROUP BY 语句

    完整攻略 – SQL GROUP BY 语句 SQL GROUP BY 语句用于将结果按照一个或多个列进行分组,然后对每组进行聚合操作,比如 COUNT、SUM、AVG 等。GROUP BY 语句的基本语法如下所示: SELECT column1, column2, …, aggregate_function(column) FROM table_nam…

    database 2023年3月27日
    00
  • 基于SpringBoot集成测试远程连接Redis服务的教程详解

    基于SpringBoot集成测试远程连接Redis服务的教程详解 简介 本文将从以下几个方面来讲解如何基于SpringBoot集成测试远程连接Redis服务: 搭建Redis服务 编写SpringBoot应用,集成Redis服务 编写单元测试,测试Redis服务连接和操作 搭建Redis服务 Redis是一款开源的键值对数据库,可以用作缓存、队列和持久化等业…

    database 2023年5月22日
    00
  • Transact_SQL 小手册

    下面是“Transact_SQL 小手册”的完整攻略。 Transact_SQL 小手册 简介 Transact-SQL(简称 T-SQL)是微软 SQL Server 数据库的 SQL 语言扩展。本手册是关于 T-SQL 的介绍和参考,适合于 T-SQL 初学者和有经验的开发人员。 数据类型 T-SQL 支持以下主要数据类型: 整数:int、bigint、…

    database 2023年5月21日
    00
  • 为啥懒 Redis 是更好的 Redis

    为啥懒 Redis 是更好的 Redis 懒 Redis 是一个 Redis 软件包装器,可以与 redis-py 配合使用,为 Redis 提供了自动断线重连和异步 I/O 等功能。懒 Redis 不仅提高了 Redis 的性能,还增加了可靠性,可维护性和易用性。 下面是使用懒 Redis 的具体攻略。 懒 Redis 的安装和导入 懒 Redis 可以通…

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