rails activerecord,mysql和mysql2的性能下降?

时间:2012-09-10 09:58:40

标签: mysql performance activerecord ruby-on-rails-3.2 mysql2

我最近才从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 vs. rails 2.3.5
  • rails 3.2.7 with mysql adapter vs mysql2
  • ActiveRecord.find_by_sql vs ActiveRecord.connection.select_all

结果

Rails 3.2.7

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

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慢?

1 个答案:

答案 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会更快。