【Mysql】索引底層資料結構

TypantK發表於2019-03-19

What's the index?

 

  • 索引是幫助MySql高效獲取資料的排好序的資料結構
  • 索引儲存在檔案裡
  • 索引有很多不同的結構(BineryTree/Hash/BTree

 

Why B+Tree is been used until now?

*BineryTree:沒有自動調整功能,如果一直分別加入排序的資料(1-2-3-4-5-6-...),會演變成連結串列,就失去了索引的意義了。

*HASH:查詢一行可以使用,但是對於範圍查詢無力

*RedBlackTree:資料多的時候高度會過高,導致時間複雜度過高。

*B-Tree:讓紅黑樹從縱向發展轉變成橫向發展,一個結點儲存多個資料。但是上層結點儲存了完整資料記錄,導致度數低。

CPU一般一次I/O將整個結點放入記憶體進行查詢索引的位置,所以在結點中查詢的時間幾乎可以忽略不計,所以結點數中的資料個數應該越多越好,所以data中應該不存完整的資料記錄

*B+Tree:

 

*頁:記憶體和磁碟之間傳輸資料的單位

 

 

Something about MyISAM and InnoDB..

對於MyISAM,其索引檔案和資料檔案不是同一個檔案,所以data中存放的是資料地址

*非主鍵索引和主鍵索引一樣,data存放的都是資料地址,每一個非主鍵索引都有單獨的B+Tree

 

 

InnoDB:資料和索引存放在同一檔案-->data中存放的是完整的資料記錄--->將所有資料聚集在一起(聚簇索引)

                --->查詢速度更快--->相對MyISAM減少了一次查詢(地址-資料)

*非主鍵索引data儲存的是主鍵,不是完整的資料記錄

 

InnoDB索引實現(聚集索引)

  • 資料檔案本身就是索引檔案
  • 表資料檔案本身就是B+Tree組織的一個索引結構檔案
  • 聚集索引的葉子節點包含了完整的資料記錄
  • 為什麼InnoDB表必須有主鍵,並且推薦使用整形自增主鍵

*自增:這樣可以讓新增的資料插入到最後,防止資料插入在中間導致分頁增加時間

*整形:節省比較時間(可比較與uuid)

  • 為什麼非主鍵索引結構葉子結點儲存的是主鍵值

*一致性:如果一個存的不是主鍵(資料記錄),更改一個資料,就要把所有索引都更改一遍

*節省儲存空間:只存一個主鍵肯定節省儲存空間啦~

相關文章