一、啥是索引
資料庫索引是建立在表的一列或多個列上的輔助對象,用於加快數據的檢索,類似於書籍的索引。當資料庫表中的數據越來越多的時候,查詢效率變慢,這時候我們就需要資料庫索引了。
優點:
加快數據的查詢速度;唯一索引可以確保數據的唯一性;可以加速表和表之間的連接,實現表和表之間的參照完整性;使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。缺點:
佔用數據表以外的物理存儲空間;需要對索引進行維護;表進行更新操作時,索引需要被重建,降低了數據的維護速度。二、索引的分類
1、普通索引(INDEX)
create index index_name on table_name(col_name)
普通索引是最基本的索引,沒有什麼特別限制,主要是為了增加這個欄位的查詢速度。
2、唯一索引(UNIQUE)
create unique index user_id_index on user(id)
唯一索引是強調表中數據記錄的唯一性,允許NULL值。
3、主鍵索引(PRIMAY KEY)
主鍵索引是一種特殊的唯一索引,將索引建在主鍵上,不允許NULL值。
4、組合索引
組合索引是多列值組成一個索引,專門用於組合搜索,效率大於索引合併。
5、全文索引(FULLTEXT)
全文索引對文本的內容進行分詞搜索。
三、索引的實現方式
1、 B+樹
B+樹和紅黑樹差不多,都是是為了儘量保持樹的平衡。但紅黑樹是二叉樹,B+樹是多叉樹,節點下面可以有多個子節點,資料庫會默認設置子節點數的一個最大值,這個值不會太小,所以B+樹一般來說比較矮胖,而紅黑樹就比較瘦高。
如果經常需要同時對兩個欄位進行and查詢,那麼使用兩個單獨索引不如建立一個複合索引,因為兩個單獨索引通常資料庫只能使用其中一個,而使用複合索引因為索引本身就對應到兩個欄位上的,效率會有很大提高。
2、散列索引
散列索引,又叫哈希索引,是通過散列函數來定位的一種索引。不過很少有單獨使用散列索引的,反而是散列文件組織用的比較多。
散列文件組織就是根據一個鍵通過散列計算把對應的記錄都放到同一個槽中,這樣的話相同的鍵值對應的記錄就一定是放在同一個文件裡了,也就減少了文件讀取的次數,提高了效率。
散列索引呢就是根據對應鍵的散列碼來找到最終的索引項的技術,其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解散列索引都是二級或更高級的稀疏索引,否則桶就太多了,效率也不會很高。
3、位圖索引
位圖索引是一種針對多個欄位的簡單查詢設計一種特殊的索引,適用範圍比較小,只適用於欄位值固定並且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態等,並且只有在同時對多個這樣的欄位查詢時才能體現出位圖的優勢。
create bitmap index idx_name on table(col_name)
位圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那麼如果使用位圖索引就會建立兩個位圖,對應男的10110和對應女的01001,這樣做有什麼好處呢,就是如果同時對多個這種類型的欄位進行and或or查詢時,可以使用按位與和按位或來直接得到結果了。
四、創建索引的原則
凡事都有兩面,有利必有弊。建立索引也是同樣的道理,我們在增加了檢索速度的同時,也會損耗相當的更新性能。所以建立索引前,要慎重的討論清楚,確實需要的時候再加。
應該創建索引的情況:
經常需要搜索的列,加快查詢速度;主鍵列上,強調唯一性;經常用在連接的列,這些列主要是一些外鍵,可以加快連接的速度;經常需要根據範圍進行搜索的列上創建索引,因為索引已經排序,其指定的範圍是連續的;經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。不應該創建索引的情況:
在查詢中很少使用或者參考的列不應該創建索引。因為很少使用到,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。當修改性能遠遠大於檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少 索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建索引。