我最近才从Rails 2.3.5升级到Rails 3.2.7,并且在我的一些查询中注意到一些性能下降。我知道Rails 3 ActiveRecord在某些情况下比Rails 2.3.5慢,但是我的基准测试让我感到惊讶,我只是想确保我没有遗漏任何东西。
作为基准测试,我运行了以下查询,这在我的应用程序中非常流行
SELECT SQL_NO_CACHE table_name.* FROM table_name WHERE ((string_col = 'value') AND (int_col1 BETWEEN 5 AND 30)) ORDER BY int_col2 DESC LIMIT 1000我查过:
结果
Rails 3.2.7
rails 3.2.7,mysql适配器,"select_all":avg。0.0148秒
rails 3.2.7,mysql适配器,"find_by_sql“avg。0.0555秒
rails 3.2.7,mysql2适配器"select_all":avg。0.045秒
rails 3.2.7,mysql2适配器,"find_by_sql“avg。0.088秒
Rails 2.3.5
rails 2.3.5,mysql适配器"select_all":avg。0.013秒
rails 2.3.5,mysql适配器"find_by_sql":avg。0.0177秒
虽然我的原始代码使用的是ActiveRecord查询api,但我使用硬编码的sql作为基准测试,并验证了直接从bash命令行调用mysql是稳定的,上面的数字来自rails/mysql适配器,而不是db。
问题
这些差异是否合理?
在Rails 3.2.7中,"find_by_sql“和"select_all”之间的差异要比Rails 2.3.5大得多。
为什么mysql2比mysql慢呢?
发布于 2012-11-02 00:23:03
我找到了这个博客帖子,它讨论了connection.select_all如何使用较低级别的数据库调用,从而消除了find_by_sql使用的一些高级库。
标准ActiveRecord API中的大多数调用都返回ActiveRecord“模型”对象。但是,在某些情况下,您可能希望绕过创建这些完整ActiveRecord对象的开销,或者您希望查询没有相应ActiveRecord类的数据。连接适配器的低级查询方法允许您编写自己的SQL,并将“普通旧数据”作为原始结果表返回。
关于mysql2 mysql2,mysql2宝石将返回转换为Ruby本身使用的更复杂的Ruby类型,而不是字符串或零。但是,如果需要这些,流或异步查询mysql2 gem的速度会更快。
https://stackoverflow.com/questions/12349318
复制相似问题