首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >记录和回放MySQL数据库负载

记录和回放MySQL数据库负载
EN

Stack Overflow用户
提问于 2012-09-05 06:07:20
回答 3查看 3K关注 0票数 2

我正在调试一个MySQL服务器中查询速度慢的问题。查询通常在100-400毫秒内完成,但有时会飙升到10秒或100秒。

查询是由我无法控制的应用程序生成的,并且有多个数据库(每个客户一个)。慢查询似乎是随机出现的,当记录慢查询时,RAM、磁盘或CPU都没有加载。当我手动运行查询时,它们运行得很好(就像在millisecs中一样),这让我怀疑与其他读写查询一起出现的锁定问题。查询本身很可怕(无法在WHERE或ORDER BY子句中使用索引),但是最大的表相对较小(最多200.000行),并且几乎没有连接。当我分析查询时,大部分时间都花在对结果进行排序上(在查询运行正常的情况下)。

我无法在测试环境中重现这种极慢的速度,我现在最好的想法是停止生产MySQL服务器,创建数据库的副本,启用完整的查询日志记录,然后重新启动服务器。通过这种方式,我应该能够重播加载并重现问题。但是一般的查询日志似乎只记录查询,而不是查询的目标数据库。我是否有用于MySQL的其他录制/重放选项?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-07 20:22:48

我终于解决了这个问题。这个应用程序正在做类似这样的事情:

代码语言:javascript
运行
复制
cursor = conn.execute("SELECT * FROM `LargeTable`")
while cursor.has_more_rows():
  cursor.fetchrow()
  do_something_that_takes_a_while()
cursor.close()

它正在获取和处理结果集,一次一行。如果循环需要100秒才能完成,则表在服务器上锁定100秒。

在MySQL服务器上更改此设置:

代码语言:javascript
运行
复制
set global SQL_BUFFER_RESULT=ON;

使缓慢的查询立即消失,因为现在将结果集推送到临时表,以便可以删除表锁,而不管应用程序使用结果集的速度有多慢。该设置会带来许多其他性能问题,但幸运的是,服务器的大小可以处理这些问题。

票数 0
EN

Stack Overflow用户

发布于 2012-09-05 06:14:13

您可以使用慢查询日志:http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

只需将阈值设置为一个非常小的值(希望您运行的是mysql > 5.1 )

否则,您可以使用tcpdump:http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/

当然,如果您使用它,您可能需要查看percona工具包的pt-query-digest来处理tcpdump输出:http://www.percona.com/doc/percona-toolkit/2.1/pt-query-digest.html

为了便于将来参考,您可能需要设置查询和服务器监视:https://github.com/box/Anemometer/wikihttps://github.com/box/RainGauge/wiki/What-is-Rain-Gauge%3F

票数 1
EN

Stack Overflow用户

发布于 2013-05-01 09:18:08

Percona正在开发一个名为Playback的新工具,它可以做你想做的事情:http://www.mysqlperformanceblog.com/2013/04/09/percona-playback-0-6-for-mysql-now-available/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12271984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档