如何使用EXPLAIN*预测MySQL查询的性能?

Ale*_*lli 53 mysql sql-execution-plan

我正在帮助维护一个程序,该程序本质上是一个大而复杂的MySQL数据库的友好只读前端 - 该程序从用户输入构建临时SELECT查询,将查询发送到DB,获取结果,对它们进行后处理,并将它们很好地显示给用户.

我想为构造的查询的预期性能添加某种形式的合理/启发式预测 - 有时用户无意中进行的查询不可避免地需要花费很长时间(因为它们将返回大量结果集,或者因为它们'重新"反对数据库索引的方式",我希望能够向用户显示一些"有些可靠"的信息/猜测查询将花多长时间.它不一定是完美的,只要它不会如此糟糕,经常与现实打成一团,导致"哭狼"效应,用户学会忽视它;-)基于这个信息,用户可能决定去喝咖啡(如果估计是5-10分钟),去吃午餐(如果是30-60分钟),杀死查询并尝试其他方式(可能对他们要求的信息有更严格的限制) )等等

我对MySQL的EXPLAIN语句不是很熟悉 - 我看到很多关于如何使用它来优化查询或数据库模式,索引等的信息,但对于如何将它用于我更有限的目的却没有太多信息 - 简单地进行预测,将DB作为给定(当然,如果预测足够可靠,我最终可能会转而使用它们来在查询可以采用的替代形式之间进行选择,但是,这是为了将来:现在,为了上述目的,我只是为了向用户展示性能猜测而感到高兴.

任何指针......?

Gre*_*reg 21

EXPLAIN不会告诉您查询需要多长时间.充其量你可以用它来猜测哪两个查询可能更快,但除非其中一个明显写得不好,否则即使这样也会非常困难.

您还应该知道,如果您使用子查询,即使运行EXPLAIN也可能很慢(在某些情况下几乎与查询本身一样慢).

据我所知,MySQL没有提供任何方法来估计查询运行所需的时间.您可以记录每个查询运行的时间,然后根据过去类似查询的历史记录构建估算值吗?

  • EXPLAIN非常有帮助.我不确定为什么这是'答案'.检出基数 - 行数越多,搜索就越多.此外,它还显示正在使用哪些索引(如果有).这对SELECT性能至关重要.至于子查询,它们实际上是非常罕见的 - 为了清晰起见,它们应该在可能的情况下进行重构. (10认同)
  • 我们此时不生成子查询,因此这应该不是问题。但无论如何,感谢您的指点——以及没有好方法来估计查询成本的消息(坏消息,但是,最好在我花费无限的时间追逐嵌合体之前学习一下!)。 (2认同)

cha*_*aos 11

我想如果你想有机会建立一个相当可靠的东西,你应该做的是建立一个统计模型,从表大小和破坏的EXPLAIN结果组件与查询处理时间相关联.尝试基于对EXPLAIN内容的思考来构建查询执行时间预测器只会花费太长时间,在将其变得模糊有用之前会给出令人尴尬的糟糕结果.