Mysql 如何对真正的数据库密集型Rails操作进行基准测试和优化?

Mysql 如何对真正的数据库密集型Rails操作进行基准测试和优化?,mysql,ruby-on-rails,optimization,benchmarking,Mysql,Ruby On Rails,Optimization,Benchmarking,客户站点的管理部分有一个操作,比如我没有构建的admin::Analytics,但必须维护它,通过执行几十个相当密集的数据库查询来编译站点使用情况分析。每当编译分析报告时,此功能始终是应用程序性能的瓶颈。但是,最近这个瓶颈变得如此严重,以至于当被访问时,网站会突然停止并无限期地挂起。直到昨天,我还没有理由在服务器上运行top命令,但这样做时,我意识到Admin::Analyticsindex会导致mysqld在四核生产VPS上以350%以上的CPU功率旋转 我已经下载了生产数据和生产日志的新副本

客户站点的管理部分有一个操作,比如我没有构建的admin::Analytics,但必须维护它,通过执行几十个相当密集的数据库查询来编译站点使用情况分析。每当编译分析报告时,此功能始终是应用程序性能的瓶颈。但是,最近这个瓶颈变得如此严重,以至于当被访问时,网站会突然停止并无限期地挂起。直到昨天,我还没有理由在服务器上运行top命令,但这样做时,我意识到Admin::Analyticsindex会导致mysqld在四核生产VPS上以350%以上的CPU功率旋转

我已经下载了生产数据和生产日志的新副本。然而,当我在开发箱上本地访问Admin::Analyticsindex,同时使用生产数据时,它会在大约10-12秒内加载,并利用我双核CPU的约150+%,这很正常。我想mysql的设置可能会出现差异,而这种差异会突然出现。此外,数据库的mysqldump现在是531MB,而28天前只有336MB。无论如何,我在VPS上没有根访问权限,因此调整mysqld性能会很麻烦,我真的很想找到这个问题的确切原因。但是,生产日志不包含信息。关于质询;他们只报告了这些请求所花费的时间,平均每个请求花费了几分钟,尽管它们似乎导致mysqld的暂停时间比这长得多,并促使我请求主机重新启动mysqld,只是为了在一个实例中恢复我们的站点

我想我可以尝试在生产中提高日志级别以获取信息。关于由Admin::Analyticsindex执行的数据库查询,但同时我害怕在生产中复制此行为,因为我不想再次调用主机来重新启动mysqld!此操作在其控制器中包含一个数据库请求,并在其视图中嵌入几十条准备好的语句

您将如何进行基准测试/诊断和优化/修复此操作


旁白:显然,我想用Google Analytics或类似的解决方案完全取代此功能,但我需要在继续之前解决此问题。

我建议看一看这篇文章:


特别是,query_reviewer和newrelic一直是我的救命稻草。

我建议大家看看这篇文章:


特别是,query_reviewer和newrelic一直是我的救命稻草。

我感谢所有这方面的帮助,但最终的解决办法是在分析表上实现两个索引,以满足此操作中的查询。一个简单的Rails迁移来添加索引和操作,现在不到一秒钟就可以在my dev box和prod上加载了

我非常感谢您在这方面提供的帮助,但最终的解决办法是在分析表上实现两个索引,以满足此操作中的查询。一个简单的Rails迁移来添加索引和操作,现在不到一秒钟就可以在my dev box和prod上加载了

您正在使用哪个存储引擎InnoDB或MyISAM?InnoDB使用一个行级表锁,在运行大型查询时,该锁应允许其他查询仍能工作。MyISAM使用一个表级锁,这似乎就是您的查询所发生的事情。你对这个统计表做了一个大的查询,这个统计表每隔一页都有插入,当这个大的查询运行时,如果你在MyISAMJonathan上,网站的其余部分将被锁定,直到查询完成,这是一个很好的线索。我不确定,但运行表演引擎;在mysql中,MyISAM显然是默认设置的,而InnoDB和其他3个引擎显然是受支持的。你知道如何确定这一点吗?到目前为止,我的谷歌搜索没有什么帮助……看看应用程序生成的SQL语句。这可能是一个令人大开眼界的体验,一些ActiveRecord生成的查询可能不好。您可能会发现一些需要手动sql的东西。您使用的是哪个存储引擎InnoDB或MyISAM?InnoDB使用一个行级表锁,在运行大型查询时,该锁应允许其他查询仍能工作。MyISAM使用一个表级锁,这似乎就是您的查询所发生的事情。你对这个统计表做了一个大的查询,这个统计表每隔一页都有插入,当这个大的查询运行时,如果你在MyISAMJonathan上,网站的其余部分将被锁定,直到查询完成,这是一个很好的线索。我不确定,但运行表演引擎;在mysql中,MyISAM显然是默认设置的,而InnoDB和其他3个引擎显然是受支持的。你知道如何确定这一点吗?到目前为止,我的谷歌搜索没有什么帮助……看看应用程序生成的SQL语句。可能是
令人大开眼界的体验一些ActiveRecord生成的查询可能不好。您可能会发现一些需要手动sql的东西。我仍然推荐我建议的关于构建/扩展的文章。query_reviewer插件可以帮助您找到缺少的索引并正确实现它们。我知道你的问题已经解决了,但我想在这里为其他可能寻求帮助的人添加这一点。我仍然推荐我建议的关于构建/扩展的文章。query_reviewer插件可以帮助您找到缺少的索引并正确实现它们。我知道你的问题已经解决了,但我想在这里为任何其他可能寻求帮助的人补充这一点