MySql索引底層資料結構與演算法

2021-10-08 17:07:13 字數 2328 閱讀 5872

一、索引資料結構

索引是幫助mysql高效獲取資料的排好序的資料結構

二叉樹

特點:左子樹小於右子樹

缺點:如果儲存自增資料,二叉樹會退化成煉表,查詢效率低

紅黑樹

特點:自平衡二叉樹,樹高相對平衡,不會出現極端情況

性質1. 節點是紅色或黑色。

性質2. 根節點是黑色。

性質3.所有葉子都是黑色。(葉子是nuil節點)

性質4. 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

性質5… 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。結果是這個樹大致上是平衡的。因為操作比如插入、刪除和查詢某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同於普通的二叉查詢

缺點:資料量比較大的時候數高不可控,資料量大的時候查詢效率還是不高

*
葉節點具有相同的深度,葉節點的指標為空

*所有索引元素不重複

*節點中的資料索引從左到右遞增排列

缺點:資料比較大的時候,每行資料不能太多,從而樹高還是不可控,影響查詢效率

b+tree(b-tree變種)

*
非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引

*葉子節點包含所有索引字段

*葉子節點用指標連線,提高區間訪問的效能

hash表

優點:根據key的hash值儲存,準確匹配效率高,時間複雜度是o(1),資料量巨大時也能高效查詢

缺點:不支援範圍查詢,模糊匹配,查詢時需要全表掃瞄

二、 myisam引擎(非聚集索引)和innodb引擎(聚集索引)

myisam儲存引擎,索引檔案和資料檔案是分離的,稱之為非聚集索引

先在索引檔案中找到資料在磁碟上儲存的位置,再去資料檔案中根據儲存位址找到對應的資料

innodb儲存引擎,表資料檔案本身就是按b+tree組織的乙個索引結構檔案,稱之為聚集索引

聚集索引葉子節點本身包含了完整的資料記錄(主鍵索引,非主鍵索引葉子節點儲存主鍵索引)

為什麼innodb表必須有主鍵,並且推薦使用整型的自增主鍵?

因為資料檔案本身就是按照b+tree的結構儲存的,所以一定要有主鍵來構建二叉樹,如果沒有設定主鍵,系統預設設定rowid作為主鍵。

使用整形,一是節省儲存空間,二是資料比較的效率高,構建索引數快

使用自增是因為葉子節點是從左往右有序遞增的,如果後續記錄插到中間,b+tree重新調整,影響效能,如果是遞增,索引會直接加在最右邊,避免了樹結構的調整

為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)

1、一致性

新增或者修改資料的時候,所有主鍵和非主鍵索引要寫入完成時,資料才能算寫入完成(為了保證一致性),如果非主鍵也儲存完整資料的話,隨著索引的增多,寫入效能不高

2、節省儲存空間

主鍵索引上已經儲存了完整的資料了,通過b+tree在主鍵索引上查詢資料效能已經比較高了,沒有必要冗餘儲存多份資料浪費磁碟空間

三、聯合索引儲存結構

為什麼推薦使用聯合索引,不使用多個單索引

構建乙個二叉樹就可以滿足搜尋,節省儲存空間,提高資料寫入速度(資料寫入時要維護索引)

儲存結構

多個字段結合起來作為key,構建b+樹的時候,比較字串的大小來決定儲存位置,字串比較大小是從左往右依次比較的,所以有了索引最左匹配原則

Mysql索引底層資料結構

想要了解索引,首先要知道索引到底是什麼呢 索引是幫助mysql高效獲取資料的排好序的資料結構 通俗來講就好比喻一本書,那這本書的目錄就好比做索引 索引儲存在檔案裡 儲存引擎是myisam的索引檔案儲存在 myi檔案中,儲存引擎是innodb的索引檔案儲存在 idb檔案中 通常資料庫中的資料就是存在硬...

MySQL索引底層資料結構詳情

目錄 為什麼是b 樹而不是b樹?首先看看b樹和b 樹在結構上的區別 b樹結構 b 樹 可以看到 首先需要了解聚簇索引和非聚簇索引。聚簇索引 在聚簇索引中,葉子頁包含了行的全部資料,節點頁值包含索引列。innodb通過主鍵聚集資料,如果沒有定義主鍵則選擇乙個唯一的非空索引列代替 如果沒有這樣的索引,i...

索引的底層資料結構

索引的底層資料結構有 1 樹tree,準確的說是b 樹 2 hash 時間複雜度對比 hash的時間o 1 tree的o logn 為什麼索引採用b 樹,而不採用hash這種結構?hash這種結構對與獲取單條記錄時的查詢效率是要比b 樹效率要高的,但是對與資料的範圍查詢效率就很低,特別是對於資料量大...