MySQL-Explain

用途

  • Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决。
  • Explain可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

用法

  • Explain语法:
    explain selectfrom … [where …]
    
    例如:explain select * from news;
    
    输出:
      +--+-----------+-----+----+-------------+---+-------+---+----+-----+
      |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
      +--+-----------+-----+----+-------------+---+-------+---+----+-----+
    
  • 这里需要强调,rows是核心指标,绝大部分rows小的语句执行一定很快。所以优化语句基本上都是在优化rows

各字段详解

下面对各个属性进行了解:

  • id:SELECT的查询序列号。

    • id如果相同,从上往下依次执行。id不同,id值越大,执行优先级越高,如果行引用其他行的并集结果,则该值可以为NULL。
  • select_type:select_type就是select的类型,可以有以下几种:

    • SIMPLE:简单SELECT(不使用UNION或子查询等)。

    • PRIMARY:最外面的SELECT。

    • UNION:UNION中的第二个或后面的SELECT语句。

    • DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询。

    • UNION RESULT:UNION的结果。

    • SUBQUERY:子查询中的第一个SELECT。

    • DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询。

    • DERIVED:导出表的SELECT(FROM子句的子查询)。

  • table:显示这一行的数据是关于哪张表的。

  • type(重要):这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

    结果值从好到坏依次是:

    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

  • possible_keys:列指出MySQL能使用哪个索引在该表中找到行。

  • key(重要):显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。

  • key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好。

  • ref:显示使用哪个列或常数与key一起从表中选择行。

  • rows:显示MySQL认为它执行查询时必须检查的行数。

  • Extra(重要):包含MySQL解决查询的详细信息,也是关键参考项之一。

    • Using index: 说明查询中使用了覆盖索引,即查询结果可以直接从索引中获取,而不需要额外访问数据行。

    • Using where: 表示MySQL将应用额外的WHERE条件来筛选行,这可能是因为查询中存在不可被索引覆盖的条件。

    • temporary: 表明MySQL需要创建一个临时表来处理查询,通常发生在执行GROUP BY或ORDER BY操作时。

    • Using filesort: 表示MySQL需要对结果集进行文件排序操作,这通常发生在无法利用索引进行排序时,或者在查询包含ORDER BY操作时。

    • Using join buffer (Block Nested Loop): 表明MySQL正在使用连接缓冲区来执行连接操作。

    • Range checked for each record (index map: N): 表示MySQL在索引中进行了范围检查,检查了每个记录以确定是否满足查询条件。

    • Full scan on NULL key: 表示MySQL正在执行全表扫描以查找具有NULL键的行。

    • Select tables optimized away: 表示MySQL优化了查询,直接从索引中获取了结果,而不需要访问表数据。

    • Impossible WHERE noticed after reading const tables: 表示MySQL在读取常量表后注意到了不可能的WHERE条件。

posted @   ヾ(o◕∀◕)ノヾ  阅读(22)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示