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

问题描述 投票:2回答:1

我的查询运行与选择了在其他一些指标缓慢。我试图找到一种工具或指导使用,我可以找出为什么MySQL的决定优先考虑1个指数或1个表(在连接的情况下)比其他人,这样我可以微调索引或查询。

到目前为止,我还没有碰到过这解释得很详细了一篇文章或一个工具,它可以为我提供它的细节。

任何输入将被理解的。由于一吨提前!

mysql
1个回答
6
投票

由于优化变得更加复杂,它就会很难理解它在做什么。最新的改进包括“基于代价的”可能的执行方法分析。对于许多查询,很明显,一个指数会比另一种更好。

有4次进入是怎么回事:

  1. EXPLAIN是相当有限的。它不处理LIMIT很好,也不一定说哪个步骤使用文件排序,或者即使有多个filesorts。在一般情况下,“行”栏目是有用的,但在某些情况下,它是无用的。规则很简单:一个巨大的数字是一个不好的迹象。
  2. EXPLAIN EXTENDED + SHOW WARNINGS;提供查询的重写版本。这并不做了很多。它确实给在ON WHEREJOINs之间的区别的线索。
  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)在一起。

一些随机的评论:

  • “索引合并交集”,或许是永远不能作为综合指数好。
  • “索引合并联盟”几乎从来没有使用过。您可能能够有效地把ORUNION
  • 较新的优化器创建“派生表”(JOIN ( SELECT ... ))在飞行的索引。但是,这是很少像重写查询,以避免这样的子查询时,它会返回大量的行为有效。 (同样,没有EXPLAINs的将指向你这个样子。)
  • 东西往往忘记了(但确实显示为一种原因不明的大“行”):COLLATIONs必须匹配。
  • 一个手法,利用PK集群:PRIMARY KEY(foo, id), INDEX(id)
  • 没有(除了经验)说,几乎无用的“前缀”索引如何(INDEX(bar(10)))。
  • FORCE INDEX是非常方便的实验,但几乎总是生产是一个坏主意。
  • 在具有SELECT,而且只提到的表中的一个的一个JOIN WHERE,优化器将通常在挑提到WHERE作为第一表的表。然后,它会做一个“嵌套循环连接”到另一桌。

(我要补充一些这方面我的食谱“敬请期待”更新:。完成)

© www.soinside.com 2019 - 2024. All rights reserved.