索引設計原則
-
選擇唯一性索引
- 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄
-
為常作為查詢條件的字段建立索引
- 如果某個字段經常用來做查詢條件,那么該字段的查詢速度會影響整個表的查詢速度。因此,為這樣的字段建⽴立索引,可以提⾼高整個表的查詢速度
-
限制索引的數目
- 索引的數目不是越多越好
- 每個索引都需要占⽤用磁盤空間,索引越多,需要的磁盤空間就越大
- 修改表時,對索引的重構和更新很麻煩
- 越多的索引,會使更新表變得很浪費時間
-
盡量使用數據量少的索引
- 如果索引的值很長,那么查詢的速度會受到影響
- 例如:對一個char(100)類型的字段進行全文檢索需要的時間肯定比對char(10)類型的字段需要的時間更多
- 如果索引的值很長,那么查詢的速度會受到影響
-
為經常需要排序、分組和聯合操作的字段建立索引
- 經常需要
order by、group by、distinct和union
等操作的字段,排序操作會浪費很多時間。如果為其建立索引,可以有效的避免排序操作
- 經常需要
-
盡量使用前綴索引
- 如果索引字段的值很長,最好使用值的前綴來索引
- 例如:text和blog類型的字段,進行全文檢索會浪費時間。如果只檢索字段的前面的若干個字符,這樣可以提高檢索速度
- 如果索引字段的值很長,最好使用值的前綴來索引
-
刪除不再使用或者很少使用的索引
- 表中數據被大量更新,或者數據的使用方式被改變后,原有的一些索引可能不再需要。數據庫管理理員應當定期找出這些索引,將他們刪除,從而減少索引對更新操作的影響
-
小表不應建議索引(超過200w數據的表,建立索引)
- 包含大量的列並且不需要搜索非空值的時候可以考慮不建索引
-
經常被用來過濾記錄的字段
- primary key 字段,系統自動創建主鍵的索引
- unique key 字段,系統自動創建對應的索引
- foreign key 約束所定義的作為外鍵的字段
- 在查詢中用來連接表的字段
- 經常用來作為排序(order by的字段)基准的字段
-
索引會占⽤用磁盤空間,創建不不必要的索引只會形成浪費
-
索引的創建必須考慮數據的操作方式
- 內容很少變動,經常被查詢,為它多創建幾個索引無所謂
- 經常性,例行性變動的表而言,則需要謹慎地創建確實必要的索引
復合索引和單一索引
-
復合索引是指多字段聯合索引,查詢時經常需要這幾個字段組合一起為條件再查詢
-
唯一索引主要是用主鍵ID索引,存儲的結構順序與物流結構一直
-
添加和刪除索引的情況
- 表的主鍵、外鍵必須有索引
- 數據量超過300w的表應該有索引
- 經常與其他表進行連接的表,在連接字段上應該建立索引
- 經常出現在where子句中的字段,特別是大表的字段,應該建立索引;
- 索引應該建立選擇性高的字段上;
- 索引應該建在小字段上,對於大的文本字段甚至超長字段,不要建索引;
- 復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替:
- 正確選擇復合索引中主列列字段,一般是選擇性較好的字段
- 復合索引的幾個字段是否經常同時以
AND
方式出現在where子句中?單字段查詢是否極少甚⾄至沒有?- 如果是,則可以建立復合索引;否則考慮單字段索引;
- 如果復合索引中包含的字段經單獨出現在where子句中,則分解為多個單字段索引?
- 如果復合索引所包含的字段超過3個,那么仔細考慮其必要性,考慮減少復合的字段;
- 如果既有單字段索引,又有這幾個字段是哪個的復合索引,一般可以刪除復合索引;
-
頻繁進行數據操作的表,不要建立太多的索引
-
刪除無用的索引,避免對執行計划造成負面影響