MySQL索引總結
MySql 索引
1. 索引分類
- 普通索引
- 唯一索引:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
- 單個索引:一個列構成的索引。
- 聯合索引(複合索引):對錶的多個列建立索引。聯合索引就是一棵 B+ 樹,只是對多個列進行排序,比如 a,b 兩個列建立聯合索引,會先按 a 排序,再按 b 排序。聯合索引的使用必須滿足最左匹配原則,即查詢從索引的最左列開始且不跳過索引中的列,**如果跳過,索引就會失效。**這是 B+ 樹索引的一個特徵。
- 聚集索引(主鍵索引):聚集索引是根據表的主鍵構建的 B+樹,葉子節點存放行資料,也稱為資料頁,資料頁之間用雙向連結串列連線。
- 輔助索引:輔助索引,其葉子節點不包含行記錄的全部資料,只包含鍵值和書籤(書籤就是相應行資料的聚集索引鍵) ,可以通過聚集索引鍵找到相應行資料。
聚簇索引:Innodb 的索引結構,索引和資料一起存放。
非聚簇索引:MyISAM 的索引結構,索引和資料分開存放,在索引中通過主鍵找到資料檔案中行資料對應的實體地址,再獲得行資料。
2. 覆蓋索引
覆蓋索引是指查詢的列和索引列相同,可以直接從輔助索引獲得查詢的結果,而不用訪問聚集索引,輔助索引中不包括整行的所有資訊,大小遠小於聚集索引,減少了大量 io 操作。
3. 索引實現
聚集索引是根據表的主鍵構建的 B+ 樹,葉節點存放行資料,也稱為資料頁,資料頁之間用雙向連結串列連線。
而輔助索引的葉節點存放的是主鍵的值,因此在使用輔助索引進行查詢時,需要先查詢到主鍵值,然後再到主索引中進行查詢。
-
B+ 樹索引:使用 B+ 樹來索引,是大多數 MySql 儲存引擎的預設索引型別。
- Innodb 儲存引擎將 B+ 樹索引分為聚集索引和 輔助索引,本質都是 B+ 樹,聚集索引是根據表的主鍵構建的索引,葉子節點存放行資料,也稱資料頁,資料頁之間通過雙向連結串列連線。而輔助索引的葉節點存放的是主鍵的值,因此在使用輔助索引進行查詢時,需要先查詢到主鍵值,然後再到主索引中進行查詢。
- MyISAM 也使用 B+ 樹作為索引儲存結構,但他們葉子節點的儲存方式有所不同,MyISAM 索引檔案和資料檔案是分離的,索引檔案僅儲存了記錄所在頁的指標。
而 Innodb 直接儲存資料或主鍵值。
-
雜湊索引:雜湊索引能以 O(1) 時間進行查詢,但失去了有序性:
- 無法用於排序和分組
- 只能精確查詢,無法進行範圍查詢和部分查詢
Innodb 的雜湊索引是自適應的,它會根據表的使用情況自動為表生成雜湊索引。
-
全文索引:MyISAM 引擎支援全文索引,用於查詢文字中的關鍵詞。全文索引是使用倒排索引實現,它記錄關鍵詞到其所在文件的對映。Innodb 在 MySQL 5.6 版本中也開始支援全文索引。
倒排索引:主要由單詞詞典和倒排檔案組成,單詞詞典出現在記憶體中,是組成所有文件的單詞的集合,單詞文件的索引項記錄了單詞本身的一些資訊和指向倒排列表的指標,通過這個指標可以找到倒排列表,倒排列表記錄了出現了某個單詞的所有文件的文件列表和單詞在這些文件中出現的位置資訊,每條記錄稱為倒排向項,而倒排檔案是倒排列表在磁碟上的物理儲存。
4. 索引的好壞
好處
- 加快查詢的速度
- 保證資料的唯一性
- 加快多表連線的速度
- 減少分組和排序的時間
壞處
- 建立索引耗費時間
- 索引佔記憶體
- 在對錶中資料進行增加,修改,刪除時,索引也要維護
5. 索引失效
- 使用 or 時,or 的兩邊都必須為索引,否則失效
- like 查詢以萬用字元開頭
- 聯合查詢必須滿足最左匹配原則,否則失效
- 對索引做運算,使用函式,不等於,索引失效
- 資料型別出現隱式轉換,如字串不加引號,索引失效
- 如果使用全表查詢比使用索引快,索引失效
6. 與紅黑樹比較
- 紅黑樹的出度為2,而 B+ 樹的出度一般都非常大,導致紅黑樹的樹高比 B+ 樹大很多,相應紅黑樹的查詢結果所需的次數也比 B+ 樹多。
- 利用磁碟的預讀特性:磁碟往往不是嚴格按需讀取,而是每次都會預讀,預讀長度一般是頁(4 K)的整數倍。而索引一個節點的大小和頁的大小相同,使得一次 I/O 就能完全載入一個節點。(作業系統知識)
7. B 樹與 B+樹
B 樹:它是一種多路平衡查詢樹,每個結點包含了 key 和 key 對應的指標,搜尋一個物件可以不用到達葉節點。
B+ 樹:是 B 樹的變形,它的非葉節點只是索引部分,所有葉節點都在同一層上,包含全部資料,且葉節點按資料資料升序連線。
B+ 樹更適合作為資料庫索引:
- I/O 次數更少:B + 樹的非葉節點不存放資料,因此節點相對 B樹 就更小,相同記憶體可以放入更多的節點,所以相對 B樹,I/O 次數更少。
- 範圍查詢:B 樹進行範圍查詢,需要進行中序遍歷,而 B+ 樹只需要遍歷葉節點就可以實現整個樹的遍歷。
- **查詢效率穩定:**B+樹查詢必須從根節點到葉子節點,查詢的路徑相同,導致每一個數據的查詢效率相當。
,而 B+ 樹只需要遍歷葉節點就可以實現整個樹的遍歷。
3. **查詢效率穩定:**B+樹查詢必須從根節點到葉子節點,查詢的路徑相同,導致每一個數據的查詢效率相當。