InnoDB文件筆記(一)

TheheiWorld發表於2019-04-09

同事推薦看看,之前都是看書,畢竟官方文件還是靠譜些(Verison 5.7)

官網地址

一、簡介

  • ACID事務、行級鎖、主鍵、外來鍵
    特性

1.1 好處

  • crash recovery 故障重啟後自動恢復
  • buffer pool 常用資料和索引會快取在記憶體中
  • foreign keys 外來鍵約束
  • checksum 資料損壞提醒
  • primary key 主鍵
  • chang buffering
  • adaptive hash index

1.2 ACID

  • Atomicity 跟事務相關,包括autocommit、commit、rollback
  • Consistency 資料保護相關,包括doublewrite buffer、crash recovery
  • Isolation 事務隔離級別
  • Durability 依賴軟體硬體

1.3 InnoDB Multi-Versioning

  • 關於資料行的變更資訊儲存在表空間裡面,叫做rollback segment
  • InnoBD在資料庫中為每一行資料儲存三個欄位。
    • DB_TRX_ID,6個位元組,記錄上一次insert/update操作的事務ID(delete看作update)
    • DB_ROLL_PTR(roll pointer),7個位元組,指向寫入rollback segement 的undo日誌記錄
    • DB_ROW_ID,6個位元組,單調遞增,聚簇索引包括row ID
  • 存入rollback segement的Undo logs 分為save undo logs和update undo logs
  • purge thread
  • 二級索引不包含系統隱藏列
  • 二級索引刪除或者更新,覆蓋索引將不能使用,InnoDB將從聚簇索引中讀取資料

二、InnoDB Architecture

InnoDB文件筆記(一)

三、InnoDB In-Memory Structures

3.1 Buffer Pool

在主記憶體中快取表資料和索引資料。緩衝池是一個連續的頁,採用LRU演算法淘汰很少使用的資料。

InnoDB文件筆記(一)

3.2 Change Buffer

change buffer是一種特殊的資料結構,快取二級索引頁的變化,並且這些快取頁不在buffer pool中。change buffer主要有DML操作導致的,並且當有讀操作將頁面載入到buffer pool後,進行合併到buffer pool。事務提交會導致change buffer合併,伺服器停止和重啟也會導致。如果二級索引包含降序索引列或主鍵包含降序索引列,則不支援更改緩衝。 change buffer預設佔有buffer pool記憶體的25%,最大為50%。

InnoDB文件筆記(一)

3.3 Adaptive Hash Index

自適應Hash Index是為加速查詢 在Mysql5.7中,對自適應Hash Index進行了分割槽,每個索引繫結一個特定的分割槽,並且每個分割槽是被分離鎖保護。分割槽是由innode_adaptive_hash_index_parts控制,預設8個分割槽,最大512。

3.4 Log Buffer

日誌緩衝區是儲存要寫入磁碟上的日誌檔案的資料的記憶體區域。預設16MB。

四、InnoDB On-Disk Structures

4.1 Tables

4.1.1 Creating InnoDB Tables

InnoDB表及其索引可以在system tablespace、file-per-table tablespace、general tablespace中建立。當innodb_file_per_table開啟,InnoDB table就隱式在每個file-per-table tablespace中,相反則在system tablespace。至於general tablespace,則需要使用create table ... tablespace語句。 當新建一個InnoDB table時,會在資料庫data目錄下建立一個.frm的檔案。

  • 在file-per-table tablespace中建立的表,在資料庫目錄下會建立一個.ibd的檔案。
  • 在system tablespace中建立的表,是在資料庫目錄下會現有的ibdata 檔案中建立。
  • 在general tablespace中建立的表,是在現有的.ibd檔案中建立。

資料行格式由innodb_default_row_format決定,預設是DYNAMIC。

4.1.2 Moving or Copying InnoDB Tables

  • Transportable Tablespaces

前提是表是由innode_file_per_table tablespace建立。

  • MySQL Enterprise Backup
  • Copying Data Files (Cold Backup Method)
  • Export and Import (mysqldump)

4.1.3 Converting Tables from MyISAM to InnoDB

  • Adjusting Memory Usage for MyISAM and InnoDB
  • Handling Too-Long Or Too-Short Transactions
  • Handling Deadlocks
  • Planning the Storage Layout
  • Converting an Existing Table
  • Cloning the Structure of a Table
  • Transferring Existing Data
  • Storage Requirements
  • Defining a PRIMARY KEY for Each Table
  • Application Performance Considerations
  • Understanding Files Associated with InnoDB Tables

4.1.4 AUTO_INCREMENT Handling in InnoDB

必須至少是索引的一部分

4.2 Indexes

聚簇索引儲存行資料,聚簇索引和主鍵是一致的。

沒有定義主鍵或者沒有合適的唯一索引,InnoDB內部在包含row id值的合成列上生成一個名為GEN_CLUST_INDEX的隱藏叢集索引。這個row id佔用6個位元組。

二級索引包含主鍵值,通過主鍵值查詢聚簇索引。

除了空間索引是R-tree結構,其他的InnoDB索引都是B-tree結構,索引記錄都存在樹的葉子節點上,預設一個索引頁大小16kb。索引記錄是有序儲存的,這樣可以讓索引頁15/16的空間是利用的,1/16的空間給索引增加預留。

4.2.1 Sorted Index Bulid

index bulid分為三個階段

  • 第一階段:掃描聚集索引,生成索引條目並將其新增到排序緩衝區。當排序緩衝區滿時,條目將被排序並寫入臨時中間檔案。這個過程也稱為“run”。
  • 第二階段:將一個或多個run寫入臨時中間檔案,對檔案中的所有條目執行合併排序。
  • 第三階段:排序後的條目被插入到B-tree中。

相關文章