Mysql 5.7查询执行可视化(Mysql如何决定查询的执行)

Mysql 5.7查询执行可视化(Mysql如何决定查询的执行),mysql,Mysql,我的查询运行得很慢,有些索引选择得比其他索引慢。我试图找到一个工具或指南,使用它我可以找出为什么MySQL决定优先选择1个索引或1个表(在连接的情况下),这样我就可以微调索引或查询 到目前为止,我还没有看到一篇文章详细解释它,也没有一个工具可以为我提供它的细节 如有任何意见,将不胜感激。提前谢谢你 随着优化器变得越来越复杂,理解它在做什么变得越来越困难。最新的改进包括对可能的执行方法进行“基于成本”的分析。对于许多查询,显然一个索引比另一个索引更好 关于正在发生的事情,有4种观点: EXPLAI

我的查询运行得很慢,有些索引选择得比其他索引慢。我试图找到一个工具或指南,使用它我可以找出为什么MySQL决定优先选择1个索引或1个表(在连接的情况下),这样我就可以微调索引或查询

到目前为止,我还没有看到一篇文章详细解释它,也没有一个工具可以为我提供它的细节


如有任何意见,将不胜感激。提前谢谢你

随着优化器变得越来越复杂,理解它在做什么变得越来越困难。最新的改进包括对可能的执行方法进行“基于成本”的分析。对于许多查询,显然一个索引比另一个索引更好

关于正在发生的事情,有4种观点:

  • EXPLAIN
    非常有限。它不能很好地处理
    LIMIT
    ,也不一定要说明哪个步骤使用filesort,或者即使有多个filesort。通常,“行”列是有用的,但在某些情况下,它是无用的。简单的规则:一个大的数字是一个坏兆头

  • 解释扩展
    +
    显示警告提供查询的重写版本。这没什么用。它确实给出了
    上的
    中的
    连接处的
    之间的区别线索

  • EXPLAIN FORMAT=JSON
    为基于成本的分析提供了更多细节,并详细说明了各种步骤,包括文件排序

  • “优化器跟踪”更进一步。(读起来相当乏味。)

  • 至于“可视化”,没有。无论如何,
    EXPLAIN
    和它的朋友们只使用他们拥有的东西。也就是说,他们没有给出“如果添加索引(a,b)”的线索。这才是真正需要的。它也没有有效地指出您不应该“在函数调用中隐藏索引列”。示例:
    其中日期(dt)='2019-01-23'
    。请注意,某些“运算符”实际上是函数调用

    我见过一些“图形解释”,但它们似乎只不过是将
    EXPLAIN
    的行装箱并在它们之间画线

    多年来,我一直在与这些问题作斗争,并写了一个部分答案——即“食谱”。它从另一个方向接近索引——解释为给定的
    SELECT
    添加什么索引。不幸的是,它只适用于更简单的查询

    我在这个论坛上研究了很多性能问题,希望能更深入地了解下一步要添加到食谱中的内容。现在,您可以通过发布您的艰难查询以及
    EXPLAIN SELECT
    SHOW CREATE TABLE
    来帮助我

    一些随机评论:

    • “索引合并交集”可能总是不如复合索引好

    • “索引合并联合”几乎从未被使用过。您可能能够有效地将
      转换为
      联合

    • 较新的优化器为“派生表”动态创建索引(
      JOIN(SELECT…)
      )。但是,当查询返回大量行时,这很少像重写查询以避免这样的子查询那样有效。(同样,没有一个
      解释
      会向您指出这一点。)

    • 一些经常被遗忘的东西(但确实显示为无法解释的大“行”):
      排序规则必须匹配

    • 利用PK集群的技巧:
      主键(foo,id),索引(id)

    • 没有任何东西(除了经验)说明“前缀”索引是多么无用(
      INDEX(bar(10))

    • FORCE INDEX
      对于实验来说很方便,但对于生产来说几乎总是一个坏主意

    • 在带有
      连接的
      选择
      ,以及只提及其中一个表的
      WHERE
      中,优化器通常会选择
      WHERE
      中提到的表作为第一个表。然后它将“嵌套循环联接”到其他表中


    (我应该在我的食谱中添加一些这方面的内容。‘敬请期待’。更新:完成。)

    查看您的查询的执行计划解释只是告诉我使用的索引mysql引擎,而没有回答任何为什么陈述我还没有找到关于“为什么”部分的任何资源。尝试关闭
    索引\u合并\u交叉点
    ,或者在
    优化器\u开关
    设置中关闭
    块嵌套\u循环
    。这两种情况通常会使事情变得缓慢。如果没有更多的细节,我就说不出真正的问题是什么。根据我在其他地方读到的资料,索引\合并\交集在很多情况下都很有用,但同时也会减慢其他地方的速度。我有多个查询,这可能会影响总体性能,因为在这种情况下它可能没有用处。
    索引\u合并\u交叉点
    有时在有两个索引
    (a)(b)
    且没有复合索引
    (a,b)
    时很有用。即使关闭它会使某些查询变慢(这不太可能),您也可以添加一个复合索引并修复它。当我们迁移到5.7时,我们遇到了一些交叉点使事情变得更糟的问题,并且在0个案例中关闭交叉点是一个问题。