2010-04-11 49 views
14

我正在構建Ruby on Rails 2.3.5應用程序。默認情況下,Ruby on Rails不提供外鍵約束,所以我必須手動完成。我想知道引入外鍵是否會降低數據庫端的查詢性能,使其不值得做。在這種情況下性能是我的首要任務,因爲我可以檢查數據與代碼的一致性。總的來說,你的建議是什麼?你推薦使用外鍵嗎?你如何建議我應該衡量這一點?向MySQL引入外鍵是否會降低性能

+0

考慮到對使用連接的表間選擇查詢的影響,外鍵實際上對性能有積極影響。我不確定它是否會產生負面影響。 – Hanseh 2010-04-11 19:32:39

+1

嘿,這個問題的三個最佳答案是「性能好處」,「沒有區別」,「性能損失」。 – 2013-03-05 04:15:40

回答

15

假設:

  1. 您已經使用支持FKS存儲引擎(即:InnoDB的)
  2. 你已經對列的索引參與

然後我猜你會通過讓MySQL強制執行完整性來獲得更好的性能。畢竟,執行引用完整性是數據庫引擎優化的功能。編寫你自己的代碼來管理Ruby中的完整性會比較慢。

如果您需要從MyISAM遷移到InnoDB以獲取FK功能,則需要考慮兩個引擎之間性能的折衷。

如果您還沒有指示,您需要決定是否需要它們。一般來說,如果您的讀取次數多於寫入次數,您需要(需要,甚至是)指示。

將FK堆疊在當前索引的東西上應該會比在應用程序代碼中實施這些類型的檢查造成的整體性能降低更少。

5

一般來說,更多的鍵(外鍵或其他鍵)會降低INSERT/UPDATE性能並提高SELECT性能。

數據完整性的附加好處很可能只是總是值得您添加外鍵所帶來的性能下降。如果一個快速應用程序中的數據是垃圾(丟失部分或其他),它有什麼好處?

發現了類似的查詢這裏:Does Foreign Key improve query performance?

3

您應該定義外鍵。一般來說(雖然我不知道關於mySQL的具體情況),但對查詢沒有影響(當有優化器,如Oracle中的基於成本的優化器時,它甚至可能會產生積極影響,因爲優化器可以依靠外鍵信息選擇更好的訪問計劃)。 根據對插入和更新的影響,可能會產生影響,但您獲得的好處(參照完整性和數據一致性)遠遠超出了對性能的影響。當然,你可以設計一個根本不會執行的系統,但主要原因不會是因爲你添加了外鍵。當您決定使用其他語言時,或者因爲業務規則稍有改變,或者因爲新的程序員加入了您的團隊等,對維護代碼的影響遠遠大於性能影響。 然後,我的建議是肯定的,去定義外鍵。您的最終產品將更加健壯。

1

兩點:
1.您確定在應用程序級別檢查完整性在性能方面會更好嗎?
2.運行自己的測試 - 測試FK對性能有積極或消極影響應該幾乎微不足道。

3

使用外鍵是一個好主意,因爲這可以確保數據的一致性(不需要孤行和其他不一致的數據問題)。

但是在添加外鍵的同時確實會引入一些性能打擊。假設你使用INNODB作爲存儲引擎,它使用PK的聚集索引,其中數據與PK一起存儲。要使用二級索引訪問數據,需要通過二級索引樹(其中節點包含PK),然後再通過聚簇索引傳遞數據以實際獲取數據。所以涉及涉及FK的父表上的任何DML將需要兩次通過子表中的索引。當然,性能影響取決於數據量,磁盤性能,內存限制(緩存的數據/索引)。所以最好用目標系統來衡量它。我想說測量它的最好方法是使用您的樣本目標數據,或至少爲您的系統提供一些有代表性的目標數據。然後嘗試運行一些有和沒有FK限制的基準。編寫客戶端腳本,在兩種情況下都會生成相同的負載。但是,如果您手動檢查FK約束,我建議您將其保留爲mysql並讓MySQL處理它。

相關問題