索引介紹

資料庫中的資料表可以比喻成生活中的字典,而索引就像我們的字典中的部首和注音一樣,可以讓我們快速的定位單詞所在的位置,當我們想要找一個字我們會先看字的部首或注音,在部首或注音中找到該字在看字是在第幾頁,而資料庫索引的概念也是相同的當我們需要找一筆資料,資料庫會先去看資料表內是否有索引,如果有索引的話會使用來索引做搜尋。

索引工作原理

索引的工作原理是使用二分搜尋法來做搜尋,因為二分搜尋法現今最快的搜尋法,而有學過基礎程式的都知道二分搜尋法的資料都是經過排序的,這也是為甚麼索引不要隨便亂做。

索引該如何設置

索引介紹有說到索引就像字典的部首或注音一樣,那稍微想一下為什麼部首能夠讓我們快速的找到字在第幾頁,部首又具備了哪些特性能夠快速的辨識字的位置呢?

高辨識性

部首之所以能夠快速找到的頁數那是因為它具有很高的辨識性,可以讓我在每次判斷中替除掉一半或以上的單詞,所以索引也是相同的道理我必須在建立索引的欄位必須要有高度辨識性。

這時有資料庫基礎的人應該第一個想法都會是那就把索引插在 ID欄位或是Primary Key欄位,Primary Key 欄位和 ID就是整張表辨識性最的高,有這樣的想法不能說錯但也不完全對,因為來我們稍微回想一下前面有說到索引是依靠二分搜尋法(平衡樹)做搜尋,而主鍵(Primary Key)欄位和 ID兩個欄位還有一項特性存在那就是唯一性,唯一性的特性會導致資料庫在做平衡樹子樹節點時,每個子樹節點內都只有一筆資料,判斷子樹節點也只替除掉一筆資料,搜尋效率上將不那麼明顯,所以索引插在主鍵(Primary Key)欄位和 ID並不是錯的,但你會發現那個效果微乎其微還是要等很久。

而索引須依據每個資料表常用哪個欄位做搜尋,這個部分是要看你對整體系統的熟悉度和狀況來做判斷。

索引需要注意哪些事情

  1. 搜尋欄位不使用索引欄位或是模糊搜尋

    前面索引工作原理有說到只要該張表有做索引那該表就會依照做索引的欄位重新做排序,而如果你 WHERE 條件並不是索引的欄位或是用like搜尋欄位資料資料庫將會不採用索引,,而如果你有開啟顯示執行計畫你會發現執行計畫的執行過程有叢集索引掃描的文字敘述,稍微先記下來後續會解釋叢集索引掃描是甚麼,之後再繼續看執行時間你會發現你執行的時間比沒差索引多出了兩倍多。

  2. 索引欄位不可亂選

    叢集索引掃描會發生原因其實很簡單因為你插索引了,資料庫在未插索引前預設都會依據個資料庫預設資料結構做儲存,而如果你有開啟執行計畫會顯示資料表掃描這邊也先記著後續會解釋,之後再繼續看執行時間你知道你時間又都花在等待上了。

    舉例來說學生時期收考試卷你依照分數高低排好,但紀錄分數卻是要按照准考證號把分數記下來,這時考試卷的排序基本上就無效了,資料庫也是一樣資料表有指定索引了,但在查詢過程中發現索引好像不是用索引欄位查詢,那資料庫則會捨棄現有索引將全部資料讀過一遍。

  3. 索引資料表盡量不要做修改新增刪除

    若資料有異動則會照成索引破碎問題(索引破碎說明)

資料表掃描(Table Scan)

資料表掃描會發生在當資料表未插索引時,會從第一筆資料開始整張資料表來做掃描到最後一張資料,雖然說是掃描但還是會依照各家資料庫儲存方式來做搜尋,這部分就要看資料庫儲存引擎得演算是如何進行的,來決定時間長短,像是 SQL Server 預設儲存機制是用 Heap 方式是儲存(說明檔連結)

個人實測