200_mysql_innodb_1_ Row_Format _page_聚簇_二級索引

      網友投稿 658 2025-04-01

      前言;

      1 Innodb 核心特性

      MVCC : 多版本并發控制

      聚簇索引 : 用來組織存儲數據和優化查詢

      支持事務 : 數據最終一致提供保證

      支持行級鎖 : 并發控制, 保障 寫 – 寫之間的控制,保障一致性

      外鍵 : 多表之間的數據一致一致性 多緩沖區支持

      自適應Hash索引: AHI 復制中支持高級特性。

      備份恢復: 支持熱備。

      自動故障恢復:CR Crash Recovery

      雙寫機制 : DWB Double Write Buffer

      2 查詢版本

      #客戶端版本 Mysql -V #server 版本 select @@version; engine 版本: SELECT * FROM information_schema.plugins; SELECT @@innodb_version;

      一 宏觀結構

      8.0 以前 InnoDB表: ibd數據和索引;? frm :存私有的數據字典信息; ?ibdataN:系統的數據字典信息

      8.0 之后只有ibd數據和索引+ 冗余的SDI私有數據字典信息 (對DDL有好處) SDI(每個表的表空間自行管理json格式的私有數據字 典信息,用來替換frm的。)

      mysql.ibd ---> 整個系統的數據字典,不再放在ibdata1

      二 微觀物理結構

      2.1 innodb記錄存儲結構

      Innodb數據頁16KB (show variables like "innodb_page_size";? #16384 16KB) 一次至少從磁盤讀取16KB到內存,一次最少刷新16KB內容到磁盤

      2.2 Innodb 行格式 Row_Format (Redundant Compact Dynamic Compressed)

      show variables like "%Row_Format%" # innodb_default_row_format dynamic create table xxx() ROW_FORMAT=DYNAMIC

      2.3 行格式的機構

      1 記錄額外的信息 (132字節)

      變長字段長度信息:? 列表形式 存儲所有可變長度字段(varchar TEXT)的真實數據(非NULL)占用的字節數 (逆序存放)

      NULL值列表: 二進制表示 1為null,0位非null (先判斷表約束,然后根據實際情況 逆序存放 最終轉成16進制)

      記錄頭信息:5個字節(40個二進制位)組成 描述該記錄的屬性

      名稱

      大小(bit)

      沒有使用

      沒有使用

      標記該記錄是否被刪除,0 表示未刪除,1表示刪除,

      B+樹的每層非葉子節點中的最小記錄都會添加該標記 (只有目錄項_非葉子節點存儲此信息 1 表示,其它是0)

      表示當前記錄擁有的記錄組數 帶頭大哥的組數為實際組數,小弟為0

      表示當前記錄在記錄堆的位置信息 (user records中heap一條條親密無間排列的結構,每條記錄在heap中的位置heap_no)

      表示當前記錄的類型,0表示普通記錄,1表示B+樹非葉子節點(目錄項)記錄,2表示Infimum最小記錄,3表示Supermum最大記錄

      表示下一條記錄的相對位置

      200_mysql_innodb_1_ Row_Format _page_聚簇_二級索引

      備注:

      記錄可以比大小,比的是主鍵

      無論插入多少條記錄,最小是Infimum (5字節記錄頭+8字節固定單詞), 最大是Supremum

      Next record 當前記錄到下一條記錄的真實距離(理解為偏移量/指針 正數代表在下一條記錄后面,負數代表前面, -111代表向前找111個字節)

      無論對數據的增刪改,innodb始終維護一個單項鏈表(鏈表各個節點由主鍵從小到大順序鏈接)

      頁面前面的記錄heap_no小,后面大,從2開始, 0-Infimum;1-Supremum最靠前

      2 真實記錄數據

      Row_id 6字節 ,行ID 唯一表示一條記錄 ?非剛需,無主鍵情況下生成(無顯示定義,可以選not null & UNIQUE的鍵)

      Trx_id 6 字節 ? ??事物ID 剛需

      Roll_pointer 7字節 回滾指針

      溢出列

      某列超出數據頁范圍 需在其他頁面存儲,其它頁面即為溢出列(COMPACT&REDUNDANT格式 會存儲真實記錄的 768字節,再拿20字節存儲其它位置的指針等信息)

      溢出頁臨界點(Mysql中規定,一個也至少存兩行記錄 每行記錄真實數據的屬性信息27字節) 132+2(27+n)< 16384 , n <8099 情況下不會有溢出列

      DYNAMIC格式不會單獨記錄真實數據的前768個字節,僅拿20字節存儲溢出頁/列的位置

      三 Innodb數據頁結構

      InnoDB存放不同數據頁設計不同類型的頁, 例如 index 頁 Change buffer頁,Inode頁,undo頁, 通用結構如下

      3.1 Page Directory

      Select * from xxx where id = xxx不會從infimum開始遍歷,innodb會設計一種 類似書的目錄結構,

      將正常記錄分成幾組(包括infimum & supremum)

      每組最后一條也是最大記錄是帶頭大哥,其余數據屬于這位大哥(n_owned=0)

      帶頭大哥在頁面中的偏移量(實際位置到第0個字節距離)取出,放在整改頁的尾部(page directory) 這些偏移量成為槽 slot(每個slot2字節,相鄰分布,越小越接近File Trailer)

      Infimum所在組只能有1條記錄,supremum所在組 1-8條, 剩下正常組 4-8條

      3.2? PageHeader 記錄數據頁中的狀態信息 例如 Free space 偏移量,slot個數等

      3.3 File header (文件頭部信息 記錄數據頁記錄的各種狀態)

      當MySQL版本小于MySQL-4.0.14,該值代表該頁所在表空間ID ,之后該值代表頁的checksum值(一種新的checksum值)。

      頁號 (單獨頁號類似身份證)

      上一個頁號 ?雙向鏈表

      下一個頁號 B+Tree特性決定了葉子節點必須是雙向列表

      頁面最后被修改后修改時候的LSN(Log Sequence Number)

      該值僅在系統表空間的第一頁中定義,代表文件至少被更新到了該LSN值

      該值代表頁屬于哪個表空間

      數據頁類型

      類型名稱

      十六進制

      描述

      FIL_PAGE_TYPE_ALLOCATED

      0x0000

      最新分配,還沒使用

      FIL_PAGE_UNDO_LOG

      0x0002

      Undo 日志頁

      FIL_PAGE_INODE

      0x0003

      存儲斷的信息

      FIL_PAGE_IBUF_FREE_LIST

      0x0004

      Change Buffer空閑列表

      FIL_PAGE_IBUF_BITMAP

      0x0005

      Change Buffer 的一些屬性

      FIL_PAGE_TYPE_SYS

      0x0006

      存儲一些系統數據

      FIL_PAGE_TYPE_TRX_SYS

      0x0007

      事務系統數據

      FIL_PAGE_TYPE_FSP_HDR

      0x0008

      表空間頭部信息

      FIL_PAGE_TYPE_XDES

      0x0009

      擴存儲區的一些屬性

      FIL_PAGE_TYPE_BLOB

      0x000A

      溢出頁

      FIL_PAGE_INDEX

      0x45BF

      索引頁,也就是數據頁

      3.4 File Trailer (文件尾部) 為了檢測頁是否已經完整地寫入磁盤(如可能發生的寫入過程中磁盤損壞、機器關機等)

      8個字節組成 ?分成2部分

      前四個字節 代表也的校驗和 通File Header中的校驗和對應

      后四個字節 代表頁面被最后修改時 對應的LSN的后四個字節 同FILE_PAGE_LSN后四個字節相同

      四 Innodb存儲引擎索引_B+樹索引

      表在插入過程中,分配的數據頁不一定是連續的,由于主鍵索引從小到大排序,所以會有頁的分裂產生,為了快速查找,制作目錄(非葉子節點)

      頁的用戶記錄中最小的主鍵值 作為key

      頁號 用page_no 表示

      B+ 樹的根節點自創建日后不再移動

      聚簇索引 主鍵的大小作為頁和記錄的排序規則, 葉子節點記錄包含表中所有列

      二級索引(輔助索引) 索引列(字段)的大小作為頁和記錄排序規則, 葉子節點存儲的是索引列和主鍵

      MyISAM 存儲引擎的數據和索引分開存儲, 索引均為二級索引,葉子節點存儲的是列+行號

      4.1 聚簇索引 使用主鍵的大小作為頁和記錄的排序規則

      頁(包括葉子節點和內節點) 內的記錄安裝主鍵大小排序 –> 單向鏈表

      各存放用戶記錄的頁節點也根據用戶記錄的主鍵大小排序 –> 雙向鏈表

      存放目錄項的頁 層級不同,同層級中頁也是根據目錄項的主鍵大小排序 –>雙向鏈表

      B+樹的葉子節點存儲完整用戶記錄包括隱藏列

      4.2 二級索引 單獨一顆B+數 葉子節點存儲列和主鍵ID以及頁號

      如果聯合索引a1 a2 a3 會先按a1排序,a1相同a2排序,a2相同a3排序, 再對應主鍵(順序打亂,隨機IO)

      創建索引

      alter table t1 add index idx_k2(k2);

      alter table t1 add index idx_k1_2(k1,k2);

      alter table city add index idx_n(name(5));? # 前置索引

      alter table city drop index idx_n

      MySQL 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel工作薄錯誤提示顏色怎么設置?
      下一篇:可視化管理Docker容器(ui-for-docker)docker使用教程相關系列 目錄
      相關文章
      婷婷久久久亚洲欧洲日产国码AV| 亚洲欧洲日产国码av系列天堂| 亚洲日本va在线视频观看| 亚洲日韩精品一区二区三区| 亚洲国产成人久久综合一区77| 亚洲欧美日韩中文高清www777| 亚洲综合小说久久另类区| 亚洲国产精品无码专区在线观看| 久久精品国产精品亚洲下载| 亚洲国产精品成人| 蜜桃传媒一区二区亚洲AV| 亚洲综合精品第一页| 亚洲色中文字幕在线播放| 亚洲人成未满十八禁网站| 亚洲精品蜜夜内射| 日本亚洲欧美色视频在线播放| 亚洲AV无码专区在线电影成人| 亚洲AV综合永久无码精品天堂| 亚洲av永久无码| 亚洲成a人无码av波多野按摩| 亚洲国产精品尤物yw在线| 亚洲性久久久影院| 亚洲另类激情综合偷自拍图| 亚洲AV无一区二区三区久久| 亚洲国产成人久久精品影视| 亚洲色图.com| 亚洲中文字幕AV在天堂| 亚洲1区2区3区精华液| 亚洲国产一区视频| 亚洲精品tv久久久久久久久 | 国产亚洲人成网站观看| 亚洲AV人人澡人人爽人人夜夜| 67pao强力打造67194在线午夜亚洲| 亚洲高清资源在线观看| 亚洲综合欧美色五月俺也去| 亚洲成av人在片观看| 亚洲熟妇av一区二区三区漫画| 婷婷精品国产亚洲AV麻豆不片| 亚洲视频免费在线看| 亚洲中文字幕无码一去台湾 | 亚洲成电影在线观看青青|