MySQL從零開始 22-索引創建原則

 基於合理的數據庫設計,經過深思熟慮後爲表建立索引,是獲得高性能數據庫系統的基礎。而未經合理分析便添加索引,則會降低系統的總體性能。索引雖然說提高了數據的訪問速度,但同時也增加了插入、更新和刪除操作的處理時間。

 是否要爲表增加索引、索引建立在那些字段上,是創建索引前必須要考慮的問題。解決此問題的一個比較好的方法,就是分析應用程序的業務處理、數據使用,爲經常被用作查詢條件、或者被要求排序的字段建立索引。基於優化器對SQL語句的優化處理,我們在創建索引時可以遵循下面的一般性原則:

 1. 確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。 因爲索引是以犧牲增刪改來提高查詢的速度。

 2. 嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,爲那些頻繁出現在where,group by,order by子句中出現的字段建立索引,即經常用作過濾器的字段上建立索引。 GROUP BY、ORDER BY

 3. 嘗試建立複合索引來進一步提高系統性能。修改複合索引將消耗更長時間,同時,複合索引也佔磁盤空間。

 4. 對於小型的表,建立索引可能會影響性能。因爲索引的查詢優勢在海量數據的查詢時纔會體現,如果是小型表,查詢優化不明顯,而且還降低了增刪改的效率,得不償失。

 5. 在不同值較少的字段上不必要建立索引,如性別字段。

 6. 避免選擇大型數據類型的列作爲索引。例如長文本數據類型text就不能用於fulltext(全文索引)。

 7. 用於聯接union的字段上建立索引;

 8. 在經常存取的多個列上建立複合索引,但要注意複合索引的建立順序要按照使用的頻度來確定。

 9. 在union等集合操作的結果集字段上,建立索引。其建立索引的目的同上。

 10. 考慮使用索引覆蓋。對數據很少被更新的表,如果用戶經常只查詢其中的幾個字段,可以考慮在這幾個字段上建立索引,從而將表的掃描改變爲索引的掃描。

 除了以上原則,在創建索引時,我們還應當注意以下的限制:

  • 限制表上的索引數目

 對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作。

  • 不要在有大量相同取值的字段上,建立索引

 在這樣的字段(例如:性別)上建立索引,字段作爲選擇條件時將返回大量滿足條件的記錄,優化器不會使用該索引作爲訪問路徑。

  • 避免在取值朝一個方向增長的字段(例如:日期類型的字段)上,建立索引

 對複合索引,避免將這種類型的字段放置在最前面。由於字段的取值總是朝一個方向增長,新記錄總是存放在索引的最後一個葉頁中,從而不斷地引起該葉頁的訪問競爭、新葉頁的分配、中間分支頁的拆分。此外,如果所建索引是聚集索引,表中數據按照索引的排列順序存放,所有的插入操作都集中在最後一個數據頁上進行,從而引起插入“熱點”。

  • 對複合索引,按照字段在查詢條件中出現的頻度建立索引

 在複合索引中,記錄首先按照第一個字段排序。對於在第一個字段上取值相同的記錄,系統再按照第二個字段的取值排序,以此類推。因此只有複合索引的第一個字段出現在查詢條件中,該索引纔可能被使用。

 因此將應用頻度高的字段,放置在複合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。

  • 刪除不再使用,或者很少被使用的索引

 表中的數據被大量更新,或者數據的使用方式被改變後,原有的一些索引可能不再被需要。數據庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章