在上週的文章中,我們了解了效果不佳的索引的後果,以及如何選擇叢集索引包含哪些欄。在本文中,我們將介紹為某些作業提供更好效能的索引如何增加其他作業的負擔。
叢集索引如何影響 INSERT、UPDATE 和 DELETE
通常,在資料表上建立索引會帶來額外的成本,即使用更多的資料頁和記憶體。在叢集資料表上,索引的影響更為明顯。叢集資料表是使用叢集索引儲存根據叢集索引鍵值排序的資料列的資料表。SELECT 陳述式在叢集資料表上的執行速度明顯更快,而 INSERT、UPDATE 和 DELETE 需要更多的時間,因為不僅資料要更新,索引也要更新。對於叢集索引,時間增加比單一個索引更為顯著,因為記錄必須在資料頁中保持正確的順序。無論是插入新記錄,還是刪除或更新現有記錄,通常都需重新排序記錄。
INSERT 在沒有任何索引的資料表上往往執行得最快。這是因為不需要重新排序或索引更新。在同一個資料拪中,執行 UPDATE 和 DELETE 是最昂貴的。原因是資料庫需要大部分時間來尋找資料表中的特定記錄。
相反,具有非最佳叢集索引的資料表的成本可能更高,其次是具有非叢集索引或根本沒有索引的資料表的成本。
對於 SELECT 陳述式,你可以通過以下兩項降低執行成本:
- 指定傳回欄的清單,以及
- 在用主索引鍵欄建立叢集索引的資料表上執行陳述式
DML 影響的範例
我們可以在下方的 album 資料表中看到索引對 DML(Data Manipulation Language,資料調處語言)陳述式的影響,該資料表的定義顯示了大量索引:
在 Navicat 中,我們可以在資料表設計器的「索引」索引標籤中檢視索引的詳細資料:
你可以使用為資料庫類型量身打造的下拉式清單選擇索引類型和方法。以下是 MySQL 7 的可用選項:
透過執行簡單的基準測試,我們可以使用僅包含主索引的原始定義測試目前 album 資料的插入率:
以下是計時結果:
在我的非正式的簡單大量測試中,將資料插入帶有附加索引的資料表的速度慢了四倍。還有其他因素會導致速度變慢;然而,我的結果提供了一個代表性的指標,即向資料表中加入索引會直接影響寫入效能。
總結
如上圖所示,索引可以加快某些査詢,但同時降低其他査詢的速度。在本文中,我們提供了一些關於叢集索引和非叢集索引的基本指南,以及哪些欄是建置索引的首選,哪些應該避免。在索引帶來的好處和負擔之間找到適當的平衡可以為査詢和預存程序提供最佳效能。
如果你對 Navicat Premium 感興趣,可以免費試用 14 天!
Rob Gravelle 居住於加拿大渥太華,是一名有 20 多年經驗的 IT 專家。過住,Rob 曾為情報相關的組織(如加拿大邊境服務局和各種商業組織)建置系統。在業餘時間,Rob 是一名出色的吉他演奏家,並擁有多張 CD和數位發行。