【问题标题】:rails activerecord, mysql and mysql2 performance degradation?rails activerecord,mysql和mysql2性能下降?
【发布时间】:2012-09-03 04:18:50
【问题描述】:

我最近才从 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 2.3.5
  • rails 3.2.7 与 mysql 适配器对比 mysql2
  • ActiveRecord.find_by_sql vs ActiveRecord.connection.select_all

结果

导轨 3.2.7

rails 3.2.7,mysql 适配器,“select_all”:平均。 0.0148 秒
rails 3.2.7,mysql 适配器,“find_by_sql”平均值。 0.0555 秒

rails 3.2.7,mysql2 适配器,“select_all”:平均。 0.045 秒
rails 3.2.7,mysql2 适配器,“find_by_sql”平均值。 0.088 秒

导轨 2.3.5

rails 2.3.5,mysql 适配器“select_all”:平均。 0.013 秒
rails 2.3.5,mysql适配器“find_by_sql”:平均。 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慢?

【问题讨论】:

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


    【解决方案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 会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多