複合式索引的一些tips
1,定義
索引基於一列或多列,指定兩個或多個列名,可為指定列的組合值建立複合式索引。一般情況下,複合式索引也是覆蓋索引(covering index)。一般而言,複合式索引(覆蓋索引除外)應該盡量避免,因為複合式索引會佔用更多的空間,讀取的時候需要更多的IO和CPU時間,進而影響效能。
要使用複合式索引的主要目的是增強索引的選擇性,而增強選擇性,最終還是要落到資料庫設計上,而不是通過建立複合式索引來實現。
如果確實需要建立複合式索引,應該儘可能的讓索引變得輕量,因為這將會減少索引的大小,進而減少IO讀寫,提高效能。
2。何時使用
複合式索引通常僅在查詢語句中的WHERE條件使用了複合式索引最左邊的列時會最有用。例如對city,state建立了組
合索引,如果查詢語句的where條件為WHERE CITY=‘xiamen',將會使用到該複合式索引,但WHERE STATE='China'將不會使用到該索引。
但即使是WHERE條件沒有指定複合式索引的第一列,但如果該複合式索引包含了查詢語句中所涉及到的列,查詢最佳化
器也會使用該複合式索引,因為這是一個覆蓋索引(covering index)
3。列的順序
當建立了一個複合式索引時,列的順序是非常關鍵的,盡量讓高選擇性的列放在複合式索引的最左端。如果把低選
擇性的列放在最左端,可能會造成無法使用該索引的情況。所謂的高選擇性,一般指不重複值達到95%
4。複合式索引和單列索引
有時候,將複合式索引劃分為單列索引是個很好的方法,因為對於複合式索引而言,只有第一列具備統計資訊,因
此,如果該列的選擇性不高,查詢最佳化工具就不會使用到該索引。如果劃分為單列索引時,每列上都有統計信
息,查詢最佳化工具會有更多的選擇,產生更好的執行計畫。
但這並不意味著多個單列索引總比複合式索引好,需要通過測試,才能得出結果。
5. 需要注意的情況
上面幾點提到了複合式索引的第一列需要使用高選擇性的。但在建立多列主鍵或唯一約束時,系統會預設對建立
約束的列建立索引,這個時候的複合式索引的選擇性可能並不是很好,需要手工修改,把高選擇性的列放在第一
位。