我最近才从 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
我检查了:
- 轨道 3.2.7 与轨道 2.3.5
- rails 3.2.7 with mysql adapter vs mysql2
- ActiveRecord.find_by_sql 与 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。
问题
这些差异合理吗?
“find_by_sql”和“select_all”之间的差异在 Rails 3.2.7 中比在 Rails 2.3.5 中大得多。
为什么mysql2比mysql慢?