Mysql索引底層原理(二) 資料表儲存引擎

2021-10-04 07:29:54 字數 1747 閱讀 3634

(1)myisam儲存引擎(不支援事務)

myisam索引和資料檔案是分離的(非聚集),mysql的資料檔案是儲存在data目錄下的,data下每個資料夾儲存的就是每個資料庫的檔案,乙個myisam錶可分為三個檔案:.frm(表結構),.myi(表索引),.myd(表資料);每個葉子節點儲存的都是資料的磁碟指標

(2)innodb儲存引擎(支援事務):

innodb索引實現(聚集) :

表資料檔案本身就是按b+tree組織的乙個索引結構檔案

聚集索引-葉節點包含了完整的資料記錄

常問的面試題:

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

答:因為mysql是通過b+樹組織這些索引的,如果不設定主鍵mysql會預設生成主鍵比如rowid等;因為整型的儲存比欄位型別要小,而且應為是innodb儲存引擎使用的是b+tree資料結構,在進行查詢資料是需要對每個元素進行比較,而整型的對比效率是高於其他資料結構的,字串等;而且由於自增的主鍵而言,b+樹是有序的,插入資料也非常方便。

為什麼非主鍵索引結構葉子節點儲存的是主鍵值而不是資料?(保障資料一致性、用時間換空間)

innodb檔案和資料檔案是聚集的,每個innodb錶可分為兩個檔案:.frm(表結構),.ibd(表索引和資料),主鍵索引葉子節點儲存的是主鍵(key)和資料(value),非主鍵索引的葉子節點儲存的是索引的資料(key,比如名字索引alice)和主鍵(value,比如15)

主鍵索引樹:

非主鍵索引樹:

由上圖可以看出非主鍵索引葉子節點儲存的是主鍵的值,得到主鍵的值之後再到主鍵索引樹去搜尋一遍,這個過程也成為回表

聯合索引的儲存結構:

聯合索引非葉子節點儲存的是聯合索引(key)和主鍵(value),其索引的順序是按索引常見的順序排的,先按第乙個索引排序,再按第二個索引排序…

對於hash索引的話,不支援區間範圍查詢,但是速度的確比b+樹要快,b+樹的雙向鍊錶支援範圍查詢,但是僅僅簡單查詢的話,hash索引還是比b+樹索引要快的。

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...

MySQL索引底層原理

通過hash演算法,能快速檢索資料 資料碰撞問題用鏈位址法 無法進行範圍搜尋 解決雜湊索引無法範圍搜尋的問題 極端情況下會退化成線性鍊錶,自增主鍵必然會導致極端情況 會自動調整樹形態,使其保持平衡,調整會消耗效能 無法完全解決二叉查詢樹的問題 絕對平衡的二叉樹,更耗效能 根本解決了紅黑數的問題 由於...

mysql索引底層原理

索引的本質 資料結構 組織資料的方式 innodb沒有主鍵索引時,判斷是否含有唯一索引,沒有唯一就生成乙個隱藏的row id作為主鍵 在資料較少時是以鍊錶的形式儲存資料的,當資料過多,長鍊表會影響資料的查詢,此時會將資料通過頁的形式進行儲存,預設一頁儲存16kb資料,每頁會與每頁之間通過指標進行連線...