Mysql+innodb数据存储逻辑
Mysql+innodb數據存儲邏輯。
表空間由段,區,頁組成
ibdata1:共享表空間。即所有的數據都存放在這個表空間內。如果用戶啟用了innodb_file_per_table,則每張表內的數據可以單獨放到一個表空間內。(只是數據,索引和插入緩沖Bitmap頁面。其他數據還是放到共享表中。)
段
表空間是由各個段組成,有數據段,索引段,回滾段等。數據與索引段都是用B+樹數據結構。
區
是由連續頁組成的空間,在任何情況下每個區的大小都是1M,每個區由64個連續的大小為16K的頁組成。當然64個這個數目也是要以改變的。但區的大小1M是不能變的,當用記啟用了參數innodb_file_per_table后創建的表大小默認為96K。前提是先用32個頁大小的碎片頁后。再申請64個連續頁。充分利用碎片頁提高存儲效率。但會犧牲查找效率。
頁
innodb默認每個大小為16K,1.2.X版本后可以設置>innodb_page_size將頁大小設置為4K,8K,16K。
常見的頁類型有
- 數據頁
- undo頁
- 系統頁
- 事務數據頁
- 插入緩沖位圖頁
- 插入緩沖空閑列表頁
- 未壓縮的二進制大對象頁(blog)
- 壓縮的二進制大對照頁(blog)
行
頁是由n行組成的,這個抽象跟現實生活中的書本的頁是一樣的。所以數據的記錄格式是也是行格式。
mysql有compact和redundant兩種格式來存放。mysql 5.1默認compact。行與行之前用鏈表結構連接起來,redundant主要是用偏移量還確定數據的順序。
行溢出問題:當行的數據超過16K頁的大小,就是溢出。varchar由于數據庫不一樣,頁的大小也不一樣的。oracle是varchar2是4000字節,mssql的varchar是8000,mysql的varchar是65532字節。數據庫是這樣處理的:將溢出的類型數據放到blog頁中。問題來了。
數據頁的大小16K。即16384字節。為什么varchar可以存儲65532字節呢?
mysql是這樣處理的:裝溢出的數據放到4個未壓縮blog中。4*16384=65535。將減去3位指針位就是65532。
總結舉一反三
計算機所有的存儲結構不外乎:數組,鏈表,哈希表,樹,或是幾種組合使用。
如:hashmap是哈希表,1.8后鏈表那塊改成樹減少了時間復雜度。內存管理,磁盤管理,編譯器的語法樹等。
建議非計算機專業的可以看看《數據結構》。很多代碼的核心原理在里面都可以找到。
轉載于:https://www.cnblogs.com/wolf12/p/8614872.html
總結
以上是生活随笔為你收集整理的Mysql+innodb数据存储逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven快速创建SpringMVC w
- 下一篇: 【组合取补集】数三角形 @CQOI201