簡體   English   中英

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

[英]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 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。

這些差異是否合理?
“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM