Mysql索引的資料結構(學習筆記)

2021-10-09 11:58:09 字數 1139 閱讀 4081

簡單比較幾種常見的資料結構,為什麼mysql索引使用b+tree。

非葉子節點不儲存資料,只儲存索引。(節省空間放更多的索引)

葉子節點包含所有索引字段(資料在此儲存)

葉子節點之間使用指標,提高區域之間的訪問性(排序)

為什麼b+tree擁有更好的效率?

舉個例子,一頁資料大小預設為16k(乙個葉節點,檢視mysql檔案頁大小(16k):show global status like 'innodb_page_size』;),主鍵為bigint型別,佔8bit大小,指標佔據空間大小6bit,一頁的資料大約為,那麼乙個高度為3的樹可以儲存的資料大約為

索引行的數量161024/14 =1170

資料行的數量(假設單個資料大小約為1kb)=16

高度為2時可以儲存資料量為 161170 = 18720

高度為3時可以儲存資料量為 1611701170 = 21,902,400

一般只有兩個檔案用於儲存表的結構資訊,和索引資料資訊。

聚集索引已經包含了所有的索引和資料資訊

為什麼innodb推薦使用自增型主鍵?因為b+tree的結構是從左到右依次增大的,如果使用隨機性的主鍵(比如uuid),這樣會導致每次插入資料的時候b+tree需要自平衡操作,

二級索引存的是主鍵(如果沒有主鍵就是隱藏列作為id),查詢到需要的資料後需要回表查,這裡主要是為了節省空間和保證獲得的資料的一致性

索引檔案和資料檔案是分開的,查詢完索引需要回表查資料。

myisam的索引和資料檔案是分開的,主鍵索引和輔助索引中儲存的是資料檔案的位址,而innodb本身就是以b+tree的形式組織的單個檔案(輔助索引仍舊分開,輔助索引儲存的是主鍵的位址)。

myisam不支援事務

myisam不支援外來鍵

mysiam有單獨變數儲存表的總行數(不能加條件),innodb需要全表掃瞄(事務的特性導致資料之間的狀態會不一致)。

innodb支援表鎖,行鎖。myisam支援表鎖。(innodb行鎖是鎖在索引上,如果沒有命中索引則會退化為表鎖)

innodb如果不指定主鍵,會預設有乙個rowid的隱藏主鍵,myisam可以沒有主鍵。

總的來說,大多數情況下會選擇innodb,mysql5.5以後也是預設使用innodb。

資料結構學習

什麼是資料結構 對計算機記憶體中的資料的一種安排。資料結構有那些?優缺點?1.陣列 插入快 知道下標 查詢慢,刪除慢,大小固定 2.有序陣列 比無序的查詢塊,刪除和插入慢,大小固定 3.棧 吃多了吐 個人理解 4.佇列 吃多了拉 個人理解 5.鍊錶 插入快,刪除快,查詢慢 6.二叉樹 查詢 插入 刪...

資料結構學習

鍊錶 class listnode definit self,x self.val x 節點值 self.next none 後繼節點值 例項化節點 n1 listnode 4 節點head n2 listnode 5 n3 listnode 1 構建引用指向 n1.next n2 n2.next ...

資料結構 學習

外部學習資料位址 一 描述 1.arraylist 是最常用的list 實現類,內部是通過陣列實現的,它允許對元素進行快速隨機訪問。2.陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力,就要將已經有陣列的資料複製到新的儲存空間中。3.當從arraylist 的中間位置插入或者刪...