資料庫中查找操作非常普遍,索引就是提升查找速度的一種手段。
B+樹索引
它是傳統意義上的索引,它是最常用、最有效的索引。
哈希索引
哈希索引是一種自適應的索引,資料庫會根據表的使用情況自動產生哈希索引,我們人為是沒辦法幹預的。
全文索引
用於實現關鍵字搜尋。但它只能根據空格分詞,因此不支援中文。
若要實現搜尋功能,可選擇lucene。
RTree索引
在mysql很少使用,僅支援geometry資料型別;相對於BTREE,RTREE的優點在於範圍查找。
資料庫以頁為儲存單元,一個頁是8K(8192Byte),一頁可以存放N筆記錄。
頁在B+樹中分為:資料頁和索引頁。
B+樹的高一般為2-4層,因此找出某一鍵值的行記錄只需2-4次IO,效率較高。
不管是聚集索引或非聚集索引,它們的邏輯結構都是一棵是B+樹,它們唯一的差別在於:
#聚集索引的資料頁存放的是完整的記錄;也就是說,聚集索引決定了資料表的實體儲存順序;
當查詢條件涉及多列時,可以使用聯合索引。
只需透過輔助索引就能取得要查詢的信息,而無需再次透過聚集索引查詢具體的記錄資訊。
由於覆寫索引並不包含整行的記錄,因此它的大小遠小於聚集索引。
它比較適合做一些統計運算。
在主鍵索引中,索引頁中存放的是主鍵和指向資料頁的偏移量;資料頁中存放的是主鍵和該主鍵所屬行記錄的位址空間。
在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。
索引頁仍然存放主鍵和和指向資料頁的偏移量,但資料頁存放的是完整的記錄。
也就是在InnoDB中,資料和主鍵索引是存放在一起的。
索引節點存放的內容一樣,仍然是鍵值資訊和指向資料頁的偏移量;但資料頁中存放的是鍵值資訊和該鍵值對應的主鍵。然後透過主鍵查詢主鍵索引就能找到該筆記錄。
在經常需要搜尋的列上,可以加快搜尋的速度;
在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
在經常需要排序的在列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
第一,對於那些在查詢中很少使用或參考的欄位不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增加了空間需求。
第二,對於那些只有很少資料值的欄位也不應該增加索引。這是因為,由於這些列的值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的數據行的比例很大。增加索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和bit資料類型的欄位不應該增加索引。這是因為,這些列的資料量不是相當大,就是取值很少。
第四,當修改效能遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠大於檢索效能時,不應該建立索引。
以上是什麼是資料庫索引?資料庫索引詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!