![](/img/trans.png)
[英]Rails3 Mysql2::Error: Unknown column - ActiveRecord::StatementInvalid
[英]rails activerecord, mysql and mysql2 performance degradation?
我最近才從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。
這些差異是否合理?
“find_by_sql”和“select_all”之間的差異在Rails 3.2.7中比在Rails 2.3.5中要大得多。
為什么mysql2比mysql慢?
我發現這篇博客文章討論了connection.select_all
如何使用較低級別的數據庫調用,從而消除了find_by_sql使用的一些高級庫。
標准ActiveRecord API中的大多數調用都返回ActiveRecord“模型”對象。 但是,有時您可能希望繞過創建這些完整ActiveRecord對象的開銷,或者您可能希望查詢沒有相應ActiveRecord類的數據。 連接適配器的低級查詢方法允許您編寫自己的SQL,並將“普通舊數據”作為原始結果表返回。
關於mysql v mysql2, mysql2 gem將返回轉換為Ruby本身使用的更復雜的Ruby類型,而不是字符串或nil。 但是,如果你需要那些,流式或異步查詢mysql2 gem更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.