【Mysql】索引底層數據結構

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)

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章