索引可以提高數據的訪問速度,但創建索引的同時也增加了插入、更新和刪除操作的處理時間,增加了物理磁盤的存儲空間。所以是否要為數據表增加索引,為數據表中哪些字段增加索引,是創建索引前必須要考慮的問題。下面作者就為數據庫表創建索引的一些原則和方法和大家做一些分享。
一. 索引是建立在數據庫表中的某些列上面的。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。
具有下面幾點情況的數據列是比較適合建立索引的:
1. primary key 字段, 系統自動創建主鍵的索引;
2. unique kye 字段,系統自動創建對應的索引;
3. foreign key 約束所定義的作為外鍵的字段;
4. 在查詢中用來連接表的字段;
5. 經常進行 order by、group by、distinct 的字段;
6. 經常使用在 Where 子句中的列的字段;
7. 經常需要根據范圍進行搜索的字段;
8. 在經常存取的多個列上建立復合索引,但要注意復合索引的建立順序要按照使用的頻度來確定;
具有下面這些特點的列則不適宜創建索引:
1. 對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求;
2. 不要在有大量相同取值的字段上,建立索引。這是因為,由於這些列的取值很少,例如一篇文章表裡面的是否推薦,在查詢的結果中,結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加這樣的字段索引,並不能明顯加快檢索速度;
3. 對於那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量是不定長的,數據結果要麼相當大,要麼取值很少;
4. 當修改性能遠遠大於檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建過多的索引。
二. 索引會占用磁盤空間,創建不必要的索引只會形成浪費。具體如何創建索引還得根據實際業務情況來定奪。
1. 對於內容很少更新卻需要經常被查詢的數據表,為它多創建幾個索引無所謂;
2. 對於需要經常性更新的表而言,則需要謹慎地創建確實必要的索引。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作;
3. 經常性的檢查數據表結構,刪除不再使用,或者很少被使用的索引。表中的數據被大量更新,或者數據的使用方式被改變後,原有的一些索引可能不再被需要。數據庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。
4. 對復合索引,按照字段在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第一個字段排序。對於在第一個字段上取值相同的記錄,系統再按照第二個字段的取值排序,以此類推。因此只有復合索引的第一個字段出現在查詢條件中,該索引才可能被使用。因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。
5. 對於小型的表,建立索引可能會影響性能。