一:邏輯存儲結構:表空間->段->區->頁->行、
表空間:一個mysql實例對應多個表空間,用于存儲記錄,索引等數據。
段:分為數據段,索引段,回滾段。innoDB是索引組織表,數據段就是b+樹的葉子節點,索引段就是b+樹的非葉子節點。段用來管理多個區。
區:表空間的單元結構。每個區大小1M,默認情況下,innoDB存儲引擎大小為16K,即一個區中一共有64個連續的區。
頁:innoDB存儲引擎磁盤管理的最小單元。每個頁的大小默認16KB,為保證頁的連續性,innoDB存儲引擎每次從磁盤申請4-5個區。
行:就是數據,有兩個隱藏字段:
Trx_id:每次對某條記錄進行改動時,都會把對應的事務id賦值給trx_id隱藏列。
Roll_pointer:每次對某條引記錄進行改動時,都會把舊的版本寫入undo日志中,然后這個隱藏列就相當于一個指針,可以通過他來找到該記錄修改前的信息。
二:內存架構:
主要是緩沖區:
1.buffer pool,緩沖池,主內存的一個區域,緩存磁盤上經常操作的真實數據,是增刪改查首先操作數據的地方(如果沒有數據則先從磁盤加載),在緩沖池修改完后再以一定頻率刷新到磁盤,減少磁盤io,加快處理速度。由頁組成,采用鏈表管理頁,分為空閑頁(未使用),被使用頁(數據未被修改),臟頁(數據被修改,與磁盤中數據不一致)
2.mysql8開始有change buffer(只針對非唯一的二級索引頁),dml語句時,如果數據頁沒在buffer pool中,則先在change buffer中緩存數據的變更,未來讀取數據的時候再合并恢復到buffer pool,然后刷新到磁盤。二級索引一般隨機插入,dml操作會影響b+樹中不相鄰的二級索引頁,造成大量磁盤io。change buffer可以在緩沖池中合并處理,減少磁盤io。
mysql5是inset buffer
3.自適應hash索引。優化buffer pool的數據查詢。innoDB自動監控并根據情況創建hash索引提高速度。
4.log buffer ,日志緩沖區。保存要寫入磁盤中的log日志數據(redo log,undo log),定期刷新到磁盤中