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

pro*_*ius 2 mysql

我的查询运行缓慢,其中一些索引被选中.我试图找到一个工具或指南,我可以弄清楚为什么MySQL决定优先考虑1个索引或1个表(在连接的情况下)比其他人更好,以便我可以微调索引或查询.

直到现在,我还没有看到一篇详细解释它的文章,或者一本可以向我提供详细信息的工具.

任何输入将不胜感激.非常感谢提前!

Ric*_*mes 6

随着优化器越来越复杂,它越来越难以理解它正在做什么.最新的改进涉及可能的执行方法的"基于成本"的分析.对于许多查询,很明显一个索引比另一个索引更好.

对于发生的事情有4种观点:

  1. EXPLAIN非常有限.它处理LIMIT得不好,也不一定说哪个步骤使用filesort,或者即使有多个filesorts.通常,"行"列很有用,但在某些情况下,它是无用的.简单的规则:大数字是一个不好的迹象.

  2. EXPLAIN EXTENDED+ SHOW WARNINGS;提供查询的重写版本.这没有做太多.它确实给之间的区别的线索ONWHEREJOINs.

  3. EXPLAIN FORMAT=JSON 提供基于成本的分析的更多细节,并阐明各种步骤,包括filesorts.

  4. "优化器跟踪"更进一步.(阅读起来相当繁琐.)

至于"可视化",没有.无论如何,EXPLAIN它的朋友只与他们拥有的东西一起工作.那就是他们没有提供"如果你添加了INDEX(a,b)"会有什么线索.这才是真正需要的.它也没有有效地指出你不应该"隐藏函数调用中的索引列".示例:WHERE DATE(dt) = '2019-01-23'.请注意,某些"运算符"实际上是函数调用.

我已经看过一些"图解说明",但它们似乎只不过是EXPLAIN在它们之间加入行和绘制线条.

多年来我一直在努力解决这些问题,并写了部分答案 - 即"食谱".它从另一个方向接近索引 - 解释为给定添加的索引SELECT.不幸的是,它只适用于更简单的查询. http://mysql.rjweb.org/doc.php/index_cookbook_mysql

我在这个论坛上处理了许多性能问题,希望能够更深入地了解接下来要添加到菜谱中的内容.现在,你可以发布您的坚韧查询,连同帮我EXPLAIN SELECTSHOW CREATE TABLE(s).

一些随机评论:

  • "索引合并交集" 可能总是不如复合索引.

  • "索引合并联盟"几乎从未使用过.你可能能够有效地OR转变UNION.

  • 较新的优化器为"派生表"(JOIN ( SELECT ... ))动态创建索引.但这很少有效,因为重写查询以避免在返回大量行时出现这样的子查询.(同样,没有一个EXPLAINs会以这种方式指出你.)

  • 经常被遗忘的东西(但确实显示为无法解释的大"行"):COLLATIONs必须匹配.

  • 使用PK群集的技巧: PRIMARY KEY(foo, id), INDEX(id)

  • 没有(除了经验)说什么几乎无用的"前缀"索引是(INDEX(bar(10))).

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

  • 在一个SELECT与一个JOINWHERE一个只在表中的一个,优化器将通常挑提到在表中WHERE作为第一表.然后它将在其他表中执行"嵌套循环连接".

(我应该在我的食谱中添加一些内容.'请继续关注'.更新:完成.)