我最近才从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,mysql adapter,“select_all”:avg。 0.0148秒
rails 3.2.7,mysql adapter,“find_by_sql”avg。 0.0555秒
rails 3.2.7,mysql2 adapter,“select_all”:avg。 0.045秒
rails 3.2.7,mysql2 adapter,“find_by_sql”avg。 0.088秒
rails 2.3.5,mysql adapter“select_all”:avg。 0.013秒
rails 2.3.5,mysql adapter“find_by_sql”:avg。 0.0177秒
虽然我的原始代码使用ActiveRecord查询api,但我使用硬编码的sql作为基准测试,并且还验证了直接从bash命令行调用mysql是稳定的,上面的数字来自rails / mysql适配器而不是db。 / p>
这些差异是否合理?
“find_by_sql”和“select_all”之间的差异在Rails 3.2.7中比在Rails 2.3.5中要大得多。
为什么mysql2比mysql慢?
答案 0 :(得分:1)
我发现这个blog post讨论了connection.select_all
如何使用较低级别的数据库调用来消除find_by_sql使用的一些高级库。
标准ActiveRecord API中的大多数调用都返回ActiveRecord “模型”对象。但是,可能存在您想要绕过的情况 创建这些完整的ActiveRecord对象的开销,或者也许是你 想要查询没有相应ActiveRecord的数据 类。连接适配器的低级查询方法允许您编写 您自己的SQL,并将“普通旧数据”作为原始结果表返回。
关于mysql v mysql2,mysql2 gem将返回值转换为Ruby本身使用的更复杂的Ruby类型,而不是字符串或nil。但是如果你需要那些,那么流式或异步查询mysql2 gem会更快。