我的查询运行与选择了在其他一些指标缓慢。我试图找到一种工具或指导使用,我可以找出为什么MySQL的决定优先考虑1个指数或1个表(在连接的情况下)比其他人,这样我可以微调索引或查询。
到目前为止,我还没有碰到过这解释得很详细了一篇文章或一个工具,它可以为我提供它的细节。
任何输入将被理解的。由于一吨提前!
由于优化变得更加复杂,它就会很难理解它在做什么。最新的改进包括“基于代价的”可能的执行方法分析。对于许多查询,很明显,一个指数会比另一种更好。
有4次进入是怎么回事:
EXPLAIN
是相当有限的。它不处理LIMIT
很好,也不一定说哪个步骤使用文件排序,或者即使有多个filesorts。在一般情况下,“行”栏目是有用的,但在某些情况下,它是无用的。规则很简单:一个巨大的数字是一个不好的迹象。EXPLAIN EXTENDED
+ SHOW WARNINGS;
提供查询的重写版本。这并不做了很多。它确实给在ON
WHERE
和JOINs
之间的区别的线索。EXPLAIN FORMAT=JSON
提供更多的细节到基于成本的分析和阐述了各种步骤,包括filesorts。作为一个“可视化”,没有。无论如何,EXPLAIN
和它的朋友只能与他们有什么工作。这是他们不给的线索,“如果你加入INDEX(A,B)”。这是真正需要的。它也没有有效地指出,你不应该“隐藏在函数调用中的索引列”。例如:WHERE DATE(dt) = '2019-01-23'
。需要注意的是一些“经营者”是有效的函数调用。
我见过几个“图形解释”,但他们似乎没有什么比拳击了EXPLAIN
的行和画他们之间的线条更。
我一直在努力与这些问题多年,并已撰写了部分答案 - 即“食谱”。解释什么指数为给定SELECT
增加 - 这从另一个方向接近索引。不幸的是,它仅适用于简单的查询。 http://mysql.rjweb.org/doc.php/index_cookbook_mysql
我获得更多洞察添加到食谱未来的希望寄托在了很多关于这个论坛的性能问题的工作。现在,你能帮助我,发布您的坚韧查询,与EXPLAIN SELECT
和SHOW CREATE TABLE(s)
在一起。
一些随机的评论:
OR
成UNION
。JOIN ( SELECT ... )
)在飞行的索引。但是,这是很少像重写查询,以避免这样的子查询时,它会返回大量的行为有效。 (同样,没有EXPLAINs
的将指向你这个样子。)COLLATIONs
必须匹配。PRIMARY KEY(foo, id), INDEX(id)
INDEX(bar(10))
)。FORCE INDEX
是非常方便的实验,但几乎总是生产是一个坏主意。SELECT
,而且只提到的表中的一个的一个JOIN
WHERE
,优化器将通常在挑提到WHERE
作为第一表的表。然后,它会做一个“嵌套循环连接”到另一桌。(我要补充一些这方面我的食谱“敬请期待”更新:。完成)