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