Code前端首页关于Code前端联系我们

MySQL优化杀手:使用EXPLAIN快速找到性能瓶颈!使用命令

terry 2年前 (2023-09-26) 阅读数 52 #数据库

EXPLAIN 非常简单。只需要在查询语句前添加关键字EXPLAIN即可。执行命令后,MySQL会输出查询执行计划的详细信息,包括表连接顺序、使用的索引、扫描的行数等。我们可以使用这些信息来确定查询性能是否满足我们的要求以及是否需要进一步优化。

准备

首先我们需要创建两个表。一张是订单表orders,包含订单信息,customer_id(客户ID)有索引,而logistics_id(物流ID)没有索引索引.. 。

  1. +-------------+----------------+-----+-----+-- - - -----+----------------+
  2. |领域 |类型 |什么都没有|关键|默认 |另外|
  3. +----- ---------+----------------+-----+-----+ ---------+- ---------------+
  4. |编号 | varchar(11) | varchar(11)否 |在|空 | |
  5. |客户 ID | varchar(32) | varchar(32) |否 |乘法 |空 | |
  6. |物流_id | varchar(32) | varchar(32) |否 | |空 | |
  7. |订单总数 |小数 (10.2) |否 | |空| |
  8. +-------- ------+----------------+-----+-----+- --------+---- ------------+

第二个是名为 customer

  1. +--- 的客户表- ---------+ ---------------+------+-----+---------+ - ----------- ----+
  2. |领域|类型 |什么都没有|关键|默认 |附加 |
  3. +-------------+------------ ----+------+-----+-- -------+----------------+
  4. |编号 | varchar(32) | varchar(32) |否 |在|空| |
  5. |名称 | varchar(50)|否 |乘法 |空 | |
  6. |电子邮件 | varchar(100) | varchar(100) |否 | |空 | |
  7. |电话 | varchar(20) | varchar(20)是 |乘法 |空 | |
  8. +--- ----------+-------------+-----+-----+- - --------+ ----------------+

然后我们用EXPLAIN 来解释订单查询信息所使用的SQL语句关于 ID 为 A101 和 A102 的客户

  1. EXPLAIN SELECT
  2. c.*,o.customer_id
  3. FROM
  4. 客户 c
  5. LEFT JOIN 订单 o ON o.customer_id = c.id
  6. WHERE c.id and ('A101', 'A102')

EXPLAIN 输出分析

经过解释,我们可以得到如下输出:

  1. +----+------- - - ----+---- ---+----------------+--------+------------ -- --+--------- ----+---------+----------+--------+-- - -- -----+----- --------+
  2. |编号 |选择类型 |表|隔断|类型 |可能的键 |关键| key_len |参考|线路 |过滤|附加|
  3. +----+---- ---------+--------+-----+---- ---+--- -------- ----+-------------+---------+----------+- ---+-- -------+-------------+
  4. | 1 |简单| c |空|范围 |小学 |小学 | 130 | 130空 | 2 | 100.00 |使用位置 |
  5. | 1 |简单|关于 |空|参考|客户 ID |客户 ID | 130 | 130测试.c.id | 1 | 100.00 |使用索引 |
  6. +----+------------+--------+------------+-------- -+-------------+-------------+---------+-------- -- -+------+----------+-------------+

从输出结果中我们可以看到以下信息:

  • select_type:查询类型
  • table:查询中包含的表
  • type:访问类型
  • possible_keys :可能的索引 :实际使用的索引 1。操作类型 select_type
    • simple:一个简单的选择查询,不包含子查询或联接操作。
    • primary:代表最外层查询。
    • union:连接操作中的第二个或下一个查询。
    • depend union:连接操作中依赖于外部查询的第二个或下一个查询。
    • 并集 结果:并集结果。
    • 子查询:子查询中第一个选定的查询。
    • 取决于子查询:子查询中的第一个可选查询取决于外部查询。
    • 派生
    • :选择派生表查询,例如嵌套子查询。?属性值为空。

      4。访问类型 type

      • all:全表扫描,逐行检查表中的每一行。
      • index:全索引扫描,逐行检查索引树中的每一行。
      • 范围:按照索引范围扫描索引部分。
      • ref:使用非唯一索引来查找匹配的行。
      • eq_ref
      • :查找具有唯一索引的匹配行。
      • const:使用常量值查找匹配的行。
      • system:与const类似,但只匹配一行,用于从系统表中读取一行数据。
      • null:比较类型

        all

        all类型的性能是最慢的,所以我们一般避免使用for all

        5类型。 possible_keys:可能使用的索引

        possible_keys 第列中列出的索引实际上可能不会被使用。 MySQL 将根据表统计信息和查询复杂度等因素选择使用哪些索引。优化查询时,您可以通过查看 possible_keys 列来判断是否需要创建新索引。以优化查询性能。如果查询中指定的所有索引均未在 possible_keys 列中列出,您可能需要创建新索引以提高查询性能。

        6。 key:实际使用的索引

        如果没有使用索引,则该属性值为NULL。

        7。 key_len:使用的索引长度

        通常,该值与索引列的字符数和列类型有关。

        8。 ref:参考列

        通常与索引列相关联。

        9。 rows:扫描的估计行数

        不是一个精确值,而是 MySQL 的估计值。

        10。 Filtered:过滤后的比例

        表示MySQL在一次查询操作时扫描的行数与实际返回的行数的比值,即查询操作返回了多少行,扫描到的行数与查询匹配查询条件。该值越接近1,查询效率越高。

        11。 Extra:附加信息

        • 用法 filesort:表示需要进行排序操作。
        • 用法 temporary:表示需要创建临时表。
        • 用法 index:表示使用覆盖索引来优化查询。
        • 用法 where:表示使用 WHERE 子句进行过滤。
        • 使用Join Buffer:表示需要使用Join buffer来处理join操作。
        • 不可能 where:指示使用 WHERE 子句始终返回 false,结果集为空。

        优化思路

        所以我们主要的优化思路是类型而不是全部,并且可以与组合 另外

        更改 SQL 语句。一般来说,有以下几种方法:

        1. 创建适当的索引:在查询包含的列上提供索引可以提高查询性能。例如,使用语句 ALTER TABLE 添加索引。
        2. 优化您的查询语句:尝试重写您的查询语句以使用更优化的 SQL 语法。例如,避免在 WHERE 子句中使用子查询和函数,因为这些操作会降低查询性能。
        3. 增加缓存:如果经常运行相同的查询,请考虑增加MySQL缓存的大小,以避免频繁的表扫描。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门