如何迭代优化 MySQL 查询?
Posted
技术标签:
【中文标题】如何迭代优化 MySQL 查询?【英文标题】:How to iteratively optimize a MySQL query? 【发布时间】:2011-04-09 19:39:40 【问题描述】:我正在尝试迭代优化慢速 mysql 查询,这意味着我运行查询、获取时间、调整它、重新运行它、获取时间等。问题是时间是非平稳的,并且查询的后续执行与之前的执行非常不同。
我知道在两次执行之间清除查询缓存或将其关闭。我也知道,在某种程度上,操作系统会以 MySQL 无法控制或理解的方式影响查询性能。但总的来说,对于这种迭代查询优化,我能做的最好的事情是什么,以便我可以比较苹果和苹果?
【问题讨论】:
你试过SELECT SQL_NO_CACHE ...
吗?这通常足以使查询运行时间在多次运行中保持稳定。
我没有,我会的,然后我会回来报告。谢谢。
好的,试过了——没有效果。一旦在初始查询后性能提升开始,查询速度就会更快。但是感谢您的提示,这在其他情况下会很有用。
【参考方案1】:
您的最佳查询优化工具是EXPLAIN
。 learn what the output means 需要一点时间,但这样做之后,您将了解 MySQL 的(可怕的、损坏的、倒退的)查询计划器如何决定最好地检索请求的数据。
查询参数的更改可能会导致查询计划大相径庭,因此这可能是您遇到的一些问题的原因。
您可能需要考虑使用using the slow query log 捕获所有 可能以低性能运行的查询。或许您会发现,所讨论的查询仅在使用某些参数时才属于低性能类别?
【讨论】:
感谢关于 EXPLAIN 的提示——这将是一个很大的帮助。我已经在仔细检查慢查询日志,我想也许这最终将是我需要更加努力的事情:建立一个缓慢的查询语料库,然后批量运行它们,希望那些找到他们的方式到慢查询日志中的差异足以产生对我在对 squawknull 的评论中描述的缓存效果的稳健性能(如下。) @shanusmagnus,如果这最终只是磁盘块缓存(或缺少缓存)的情况,您应该检查 MySQL 配置以确定它是否已经针对该硬件的性能进行了调整,例如给定的数据库大小。 Percona 的 MySQL Performance Blog 可能会引起您的兴趣。【参考方案2】:创建一个运行查询 1000 次的脚本,或者任何次数的迭代都会导致结果稳定。
然后按照上述流程进行操作,但只需确保您不依赖于单个执行,而是依赖于多个执行的平均值,因为您是对的,随着行数的变化,结果将不稳定,而你的机器正在做其他事情。
此外,如果这对您的用例有意义,请尝试在查询中使用广泛的输入。
【讨论】:
这通常是个好建议,但遗憾的是在我的特定情况下没有多大帮助,其中单个查询在后续查询中的执行时间从 25 秒到 700 毫秒。显然缓存在起作用,并且似乎是相关磁盘块上的操作系统级缓存。 “完全不同”的同类查询可以将执行时间缩短至 25 秒范围,但自动创建差异足够大的查询以以这种方式运行系统并非易事。以上是关于如何迭代优化 MySQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章