在基於 MyISAM 的數據庫上使用多個 JOIN 查詢性能
我正在使用MySQL數據庫中的 Enron 電子郵件數據集。在我從轉儲文件執行數據導入到基於 MyISAM 的數據庫後,我得到了一組表,它們之間沒有通過外鍵建立任何連接。
我讀到MyISAM 更適合這種情況,如果表更靜態,選擇更多,更新和刪除操作更少。就我而言,所有查詢都將是只讀的,每個查詢中有多個連接。考慮到 MyISAM 根本不支持外鍵這一事實,這會影響我的查詢性能嗎?如果是,我該如何優化它們?
我應該將數據庫轉換為 InnoDB 格式,還是使用 MyISAM 格式更好?
執行 JOIN 不需要外鍵。外鍵是出於安全原因而存在的限制(因此您無法更改列的值,或刪除/插入最終導致表之間狀態不一致的行)。的確,在大多數情況下,外鍵都用作 JOIN 匹配條件。
推薦 InnoDB 的原因是因為它支持數據完整性,這要歸功於這些外鍵和數據庫事務。它還可以支持更好的並發性,因為寫入不需要鎖定整個表才能繼續,只需修改行。這就是為什麼推薦用於寫入載入的原因。如果您的表將是只讀的,事務、完整性和並發性就不是那麼重要(因為您不會修改數據),這就是為什麼在這些情況下更簡單的 MyISAM 格式可以正常工作的原因。
InnoDB 也有自己的緩衝管理,可以比 MyISAM 更好地進行微調,MyISAM 的記憶體僅適用於索引,將數據記憶體管理留給文件系統記憶體。
在一種情況下,創建外鍵可以提高性能:**在創建時,InnoDB 會在列上創建一個二級索引,**如果它事先沒有的話。這個功能很容易克服,就像在 JOIN 上可能引用的任何列上創建一個一樣。
綜上所述,InnoDB 有很多優勢,但在只讀工作負載中 MyISAM 可以正常工作。但是,如果您想要數據安全,則必須在軟體層上實現它,容易導致錯誤,這就是為什麼總是推薦使用外鍵的原因。