首頁  >  文章  >  資料庫  >  什麼是資料庫索引?資料庫索引詳解

什麼是資料庫索引?資料庫索引詳解

零下一度
零下一度原創
2017-04-21 15:56:273497瀏覽


索引是什麼?

資料庫中查找操作非常普遍,索引就是提升查找速度的一種手段。

索引分類

  1. B+樹索引
    它是傳統意義上的索引,它是最常用、最有效的索引。

  2. 哈希索引
    哈希索引是一種自適應的索引,資料庫會根據表的使用情況自動產生哈希索引,我們人為是沒辦法幹預的。

  3. 全文索引
    用於實現關鍵字搜尋。但它只能根據空格分詞,因此不支援中文。
    若要實現搜尋功能,可選擇lucene。

  4. RTree索引
    在mysql很少使用,僅支援geometry資料型別;相對於BTREE,RTREE的優點在於範圍查找。

B+樹索引

資料庫以頁為儲存單元,一個頁是8K(8192Byte),一頁可以存放N筆記錄。
頁在B+樹中分為:資料頁和索引頁。
B+樹的高一般為2-4層,因此找出某一鍵值的行記錄只需2-4次IO,效率較高。

聚集索引和非聚集索引

不管是聚集索引或非聚集索引,它們的邏輯結構都是一棵是B+樹,它們唯一的差別在於:

  • #聚集索引的資料頁存放的是完整的記錄;也就是說,聚集索引決定了資料表的實體儲存順序;

  • ##非聚集索引的資料頁只存指向記錄的地址信息,它真正的數據已經在聚集索引中存儲了。

聯合索引 和 覆寫索引

  1. 聯合索引

    當查詢條件涉及多列時,可以使用聯合索引。

  2. 覆蓋索引

    只需透過輔助索引就能取得要查詢的信息,而無需再次透過聚集索引查詢具體的記錄資訊。
    由於覆寫索引並不包含整行的記錄,因此它的大小遠小於聚集索引。
    它比較適合做一些統計運算。

MyISAM索引實作

  1. 主鍵索引

    在主鍵索引中,索引頁中存放的是主鍵和指向資料頁的偏移量;資料頁中存放的是主鍵和該主鍵所屬行記錄的位址空間。

  2. 輔助索引

    在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。

綜上所述,在MyISAM中,索引檔案和資料檔案分開存放,不管是主鍵索引或輔助索引,都屬於非聚集索引。

InnoDB索引實作

  1. 主鍵索引

    索引頁仍然存放主鍵和和指向資料頁的偏移量,但資料頁存放的是完整的記錄。
    也就是在InnoDB中,資料和主鍵索引是存放在一起的。

  2. 輔助索引

    索引節點存放的內容一樣,仍然是鍵值資訊和指向資料頁的偏移量;但資料頁中存放的是鍵值資訊和該鍵值對應的主鍵。然後透過主鍵查詢主鍵索引就能找到該筆記錄。

綜上所述:

  • 聚集索引這種實作方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要擷取兩遍索引:先檢索輔助索引取得主鍵,然後用主鍵到主索引檢索取得記錄。

  • InnoDB的輔助索引也會包含主鍵列,所以,如果主鍵定義的比較大,其他索引也會很大。如果想在表上定義 、很多索引,則爭取盡量把主鍵定義得小一些。 InnoDB 不會壓縮索引。

索引的優點

  • 第一,透過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

  • 第二,可以大幅加快資料的檢索速度,這也是建立索引的最主要的原因。

  • 第三,可以加速表和表之間的連接,特別是在實現資料的參考完整性方面特別有意義。

  • 第四,在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

  • 第五,透過使用索引,可以在查詢的過程中,使用最佳化隱藏器,提高系統的效能。

索引的缺點

  • 第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

  • 第二,索引需要佔物理空間,除了資料表佔資料空間之外,每個索引還要佔一定的實體空間,如果要建立叢集索引,那麼需要的空間就會更大。

  • 第三,當資料表中的資料增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

哪些情況需要加索引?

  • 在經常需要搜尋的列上,可以加快搜尋的速度;

  • 在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;

  • 在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

  • 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;

  • 在經常需要排序的在列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

  • 在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。

哪些情況不需要加索引?

  • 第一,對於那些在查詢中很少使用或參考的欄位不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增加了空間需求。

  • 第二,對於那些只有很少資料值的欄位也不應該增加索引。這是因為,由於這些列的值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的數據行的比例很大。增加索引,並不能明顯加快檢索速度。

  • 第三,對於那些定義為text, image和bit資料類型的欄位不應該增加索引。這是因為,這些列的資料量不是相當大,就是取值很少。
    第四,當修改效能遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠大於檢索效能時,不應該建立索引。

#

以上是什麼是資料庫索引?資料庫索引詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn