同事推薦看看,之前都是看書,畢竟官方文件還是靠譜些(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 In-Memory Structures
3.1 Buffer Pool
在主記憶體中快取表資料和索引資料。緩衝池是一個連續的頁,採用LRU演算法淘汰很少使用的資料。
3.2 Change Buffer
change buffer是一種特殊的資料結構,快取二級索引頁的變化,並且這些快取頁不在buffer pool中。change buffer主要有DML操作導致的,並且當有讀操作將頁面載入到buffer pool後,進行合併到buffer pool。事務提交會導致change buffer合併,伺服器停止和重啟也會導致。如果二級索引包含降序索引列或主鍵包含降序索引列,則不支援更改緩衝。 change buffer預設佔有buffer pool記憶體的25%,最大為50%。
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中。