MySQL 数据库的存储结构
MySQL 數據庫的存儲結構
?
數據庫存儲結構
從小到大、行>頁 >區>段>表空間 (在Oracle中將頁稱為"塊")
頁是數據庫管理存儲空間的基本單位,即,數據庫I/O的最小單位是頁
InnoDB默認頁大小為16K,可以通過show variavles like '%innodb_page_size%'來查詢頁的大小。
一個區會分配64個連續的頁,因此InnoDB的一個區是 1M
段是數據庫的分配單位,且不要求段中的區與區必須連續。不同數據庫對象以不同的段形式存在,也就是說創建一個表時會創建一個表段,創建一個索引時會創建一個索引段。一個段只能屬于一個表空間。
表空間是一個邏輯容器,從管理上可以劃分為 系統表空間、用戶~、臨時~、撤銷~。InnoDB有兩種表空間類型:共享表空間和獨立表空間。使用show variables like 'innodb_file_per_tble;'如果查詢結果為ON,那么說明每張表都會大單獨保存為一個.ibd文件
?
頁內存儲結構
借用陳旸老師的圖:
文件頭:數據頁之間形成雙相鏈表。頭文件中有兩個字段---FILE_PAGE_PAGE和FILE_PAGE_NEXT。采用鏈表就使得數據頁之間不必是物理上的連續,而是邏輯上的連續。
文件尾:進行頁傳輸的時候可以將文件尾的檢驗和和文件頭的檢驗和對比來進行校驗。假如在傳輸頁的時候發生了斷電中斷,就會造成校驗和的不相等。
記錄部分:“最小和最大記錄”和“用戶記錄”占據頁的主要空間,“空閑空間”則是在新數據插入時,會在空閑空間開始存儲。
索引部分:頁目錄起到了索引的作用。因為在頁的節點中記錄是以單向鏈表的形式組織起來的,查詢效率不高,因此在因此在頁目錄中提供了二分查找的方式來加速查詢效率。
?
B+樹如何在數據頁上進行查詢
?
B+結構與存儲結構
在索引模型中我們說過索引可以分為聚集索引和非聚集索引,而每一個索引都相當于一棵B+樹,只是兩者的存儲內容不同。
在B+樹種每個節點都是一個頁,這也就是為什么“每訪問一次節點就需要對磁盤進行一次I/O操作”。
每次新建節點的時候都會申請一個頁空間,而且同一層的節點之間會形成雙向鏈表(利用文件頭的雙向指針)
在節點內部,非葉子節點存儲的是索引鍵和指向下一層的指針,葉子節點存儲的是關鍵字(或許還有行記錄),節點內部的記錄之間是單向鏈表并使用頁目錄加速。
即,同層節點之間構成雙向鏈表,節點內記錄之間形成單向鏈表
?
檢索過程
從B+樹的根節點開始,逐層順著索引向下尋找目標關鍵字,找到關鍵字對應的節點后,就將該頁加載到內存中
然后利用頁目錄進行粗略的二分查找,再通過鏈表遍歷找到具體位置。
(聚集索引的行記錄在物理上是連續的)
?
總結
以上是生活随笔為你收集整理的MySQL 数据库的存储结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度优先搜索(DFS)
- 下一篇: 小爱音箱怎么样(3699小游戏)