在意識到應用程序由於ORM而遭受N + 1問題之後,我想要獲得有關可以執行的改進的更多信息以及使用時間比較之前的改進(與N + 1問題)和之後。
那麼這樣的改進之前和之後的時間差是多少?
任何人都可以給我一個鏈接到一些分析問題和檢索統計的文章嗎?Rails:N + 1問題...需要統計數據
3
A
回答
4
你真的不需要這個統計數據,只是數學。 N + 1(或更好的1 + N)表示
- 1查詢來獲取記錄,並
- N次查詢得到它
更大的N是,相關聯的所有記錄性能會受到更多影響,特別是如果您的查詢通過網絡發送到遠程數據庫。這就是爲什麼N + 1問題在生產中不斷出現的原因 - 它們在開發模式中通常微不足道,而數據庫中的數據很少,但隨着數據在生產中增長到數千或數百萬行,您的查詢將緩慢地窒息您的服務器。
您可以改用
- 單個查詢(通過連接)或
- 2查詢(一個用於主記錄,一個所有相關記錄
第一個查詢會返回比嚴格需要的數據更多的數據(第一條記錄的數據將在每一行中被複制),但這通常是一個很好的權衡。第二個查詢可能會對大數據集有點麻煩,因爲所有外鍵都作爲一個單一的範圍,但再次,它通常是一個值得做的折衷。
實際數字取決於太多的變量,使統計數據有意義。數字或記錄,數據庫版本,硬件等。
由於您用rails標記了這個問題,ActiveRecord在避免N + 1查詢方面做得很好,如果您知道如何使用它。查看eager loading的解釋。
0
時差將取決於由於N + 1問題而執行了多少次附加選擇。下面是關於給予另一stackoverflow question答案報價N + 1 -
報價開始
SELECT * FROM Cars;
/* for each car */
SELECT * FROM Wheel WHERE CarId = ?
換句話說,你有一個選擇的汽車,然後再增加額外的N選擇,其中N是汽車總數。
報價結束
在上述時間差的例子將取決於許多汽車的記錄是如何在數據庫中,並花了多長時間,每次查詢「輪」表中的代碼/ ORM獲取的新紀錄。如果你只有2輛車的記錄,那麼消除N + 1問題後的差異可以忽略不計,但如果你有一百萬輛汽車記錄,那麼它將會產生重大影響。
相關問題
- 1. SQL問題(需要刪除所有標籤以1個計數)數據庫
- 2. 需要爲大學設計數據庫的想法 - Messeging系統問題
- 3. Dplyr select() - 需要數值數據問題
- 4. 需要簡單的系統設計問題面試
- 5. 統計問題
- 6. 數據庫設計問題 - 需要的性能
- 7. 數據庫ERM設計問題 - 需要推薦
- 8. 數據庫設計問題 - 需要澄清
- 9. 問題需要
- 10. Django活塞問題 - 「oauth_user_auth()只需要1個參數(2給出)」
- 11. OpenTBS圖表'需要兩個統計圖'數據結構建議
- 12. 需要與球員統計數據,如剷球,通行證等
- 13. 存儲統計數據,我需要DECIMAL,FLOAT還是DOUBLE?
- 14. 在Android應用程序購買 - 需要一些統計數據
- 15. 當我們需要在數據庫設計中使用1對1關係時?
- 16. node.js需要問題
- 17. 需要CSV問題
- 18. Spark類別數據摘要統計
- 19. 數據庫設計問題(或問題)
- 20. 統計數據
- 21. 統一計時器問題
- 22. Android市場統計問題
- 23. Mysql的計算問題:1 + 1 = 1.999999999
- 24. MongoDB排序,計數,查詢問題。需要的邏輯幫助
- 25. 保留/釋放計數問題。需要澄清
- 26. 需要joomla1.5中的統計模塊
- 27. 在設計系統時需要建議
- 28. 數據庫設計問題
- 29. 數據包計時問題
- 30. 數據庫設計問題