如何使用EXPLAIN来预测MySQL查询的性能?
我正在帮助维护一个程序,这本质上是一个大型复杂的MySQL数据库友好的只读前端 – 程序从用户的input构build特定的SELECT查询,将查询发送到数据库,获取结果,后处理它们,并很好地显示给用户。
我想为构build的查询的预期性能添加某种forms的合理/启发式预测 – 有时,用户无意间进行查询,这将不可避免地花费很长时间(因为它们会返回巨大的结果集,在数据库被索引的方式上,“反对谷物”),我希望能够向用户展示一些“有些可靠”的信息/关于查询要花多长时间的猜测。 它不一定是完美的,只要它不会变得如此糟糕,经常与现实相冲突,导致用户学会忽视它的“哭泣”效应;-)根据这个信息,用户可能会决定去喝一杯咖啡(如果估计是5-10分钟),去吃午饭(如果是30-60分钟),杀死查询并尝试其他的东西(也许更严格的限制他们要求的信息)等等等等
我对MySQL的EXPLAIN语句不是很熟悉 – 我看到很多关于如何使用它来优化查询或数据库的模式,索引等的信息,但没有太多的关于如何将它用于我的更有限的目的 – 简单地做一个预测,把数据库作为一个给定的(当然,如果预测足够可靠,我最终可能会转而使用它们来在查询可能需要的替代forms之间进行select,但是,对于现在来说,我只是为了向用户展示性能猜测而非常高兴)。
任何指针…?
EXPLAIN不会给你任何指示多长时间的查询。 最好你可以用它来猜测哪个查询可能会更快,但除非其中一个显然写得不好,否则即使这样也会很困难。
你也应该知道,如果你使用子查询,即使运行EXPLAIN也会很慢(在某些情况下几乎和查询本身一样慢)。
就我所知,MySQL不提供任何方法来估计查询运行的时间。 你可以logging每个查询运行的时间,然后根据过去的类似查询的历史build立一个估计?
我认为,如果你想有一个机会来build立一些合理可靠的东西,你应该做的是build立一个统计模型的表大小和分解EXPLAIN结果组件相关的查询处理时间。 试图build立一个基于思考 EXPLAIN内容的查询执行时间预测器会花费太长的时间,给它带来令人尴尬的糟糕结果,然后才会变得模糊有用。
MySQL EXPLAIN有一个名为Key
的列。 如果在这个列中有什么东西,这是一个非常好的指示,这意味着查询将使用索引。
使用索引的查询通常是安全的,因为数据库devise者在devise数据库时可能会想到它们。
然而
还有另外一个叫Extra
字段。 该字段有时包含文本using_filesort
。
这非常糟糕。 这实际上意味着MySQL知道查询的结果集大于可用内存,因此将开始将数据交换到磁盘以进行分类。
结论
不要试图预测查询所花的时间,只要看看这两个指标即可。 如果查询是using_filesort
,则拒绝该用户。 根据你想要的严格程度,如果查询不使用任何键,你也应该否认它。
阅读关于MySQL EXPLAIN语句结果集的更多信息