2011-04-09 106 views
6

我试图迭代地优化一个慢的MySQL查询,这意味着我运行查询,获取时间,调整它,重新运行它,获取时间等。问题是时间不固定,以后查询的执行与以前的执行完全不同。如何迭代优化MySQL查询?

我知道在执行过程中清除查询缓存或将其关闭。我也知道,在某种程度上,操作系统会以MySQL无法控制或理解的方式影响查询性能。但是总的来说,我可以做这种迭代查询优化的最好方法是什么,以便我可以将苹果与苹果进行比较?

+2

你尝试过'SELECT SQL_NO_CACHE ...'吗?这通常足以使查询在多次运行中运行时间稳定。 – Galz 2011-04-09 20:20:57

+0

我没有,我会的,然后我会回报。谢谢。 – shanusmagnus 2011-04-10 17:07:15

+0

好吧,试过了 - 没有效果。在最初的查询之后,性能提升开始后,查询速度会更快。但是,谢谢你的提示,这将有助于了解其他情况。 – shanusmagnus 2011-04-11 02:00:21

回答

2

您的最佳查询优化工具是EXPLAIN。这将需要learn what the output means一点点,但这样做后,你会明白MySQL的(可怕的,破碎的,向后)查询计划器决定如何最好地检索请求的数据。

将参数更改为查询可能会导致截然不同的查询计划,因此这可能会解决您所看到的一些问题。

您可能想要考虑​​以捕获全部查询可能运行的性能低下。也许你会发现,在使用某些参数时,有问题的查询只属于低性能类别?

+0

感谢关于EXPLAIN的提示 - 这将是一个很大的帮助。我已经仔细检查了慢速查询日志,我想也许这最终会成为我需要更加努力的事情:建立一个慢速查询语料库,然后在批处理中运行它们,希望那些能够找到他们的方法进入慢速查询日志是非常不同的,以产生性能强大的缓存效果,我在我的评论中描述的缓存效果(下面) – shanusmagnus 2011-04-10 17:06:15

+0

@shanusmagnus,如果这仅仅是磁盘块缓存(或缺乏)的结果,您应该检查MySQL配置以确定它是否已针对该硬件的性能进行了调整,以确定给定的数据库大小。 Percona的[MySQL性能博客](http://www.mysqlperformanceblog.com/)可能会令你感兴趣。 – Charles 2011-04-10 17:09:58

1

创建一个运行查询1000次的脚本,或任何数量的迭代导致结果稳定。

然后如上所述按照您的流程进行操作,但只要确保您不依赖单个执行,而是平均执行多次执行,因为您是对的,结果将不会稳定,因为行数会发生变化,你的机器正在做其他事情。

另外,如果这对您的用例有意义,请尝试将大量的输入用于查询。

+0

这是一个很好的建议,但遗憾的是,在我的特殊情况下,单个查询在后续查询中的执行时间从25秒到700毫秒不会有帮助。很明显,缓存在工作,似乎是相关磁盘块上的OS级缓存。 “完全不同”的相同类型的查询可以将执行时间降低到25秒范围,但这不是微不足道的,自动创建的查询与通过这种方式运行系统的查询完全不同。 – shanusmagnus 2011-04-10 17:04:18