同事推薦看看,以前都是看書,畢竟官方文檔仍是靠譜些(Verison 5.7)html
官網地址node
- DB_TRX_ID,6個字節,記錄上一次insert/update操做的事務ID(delete看做update)
- DB_ROLL_PTR(roll pointer),7個字節,指向寫入rollback segement 的undo日誌記錄
- DB_ROW_ID,6個字節,單調遞增,聚簇索引包括row ID
在主內存中緩存表數據和索引數據。緩衝池是一個連續的頁,採用LRU算法淘汰不多使用的數據。mysql
change buffer是一種特殊的數據結構,緩存二級索引頁的變化,而且這些緩存頁不在buffer pool中。change buffer主要有DML操做致使的,而且當有讀操做將頁面加載到buffer pool後,進行合併到buffer pool。事務提交會致使change buffer合併,服務器中止和重啓也會致使。若是二級索引包含降序索引列或主鍵包含降序索引列,則不支持更改緩衝。 change buffer默認佔有buffer pool內存的25%,最大爲50%。算法
自適應Hash Index是爲加速查詢 在Mysql5.7中,對自適應Hash Index進行了分區,每一個索引綁定一個特定的分區,而且每一個分區是被分離鎖保護。分區是由innode_adaptive_hash_index_parts控制,默認8個分區,最大512。sql
日誌緩衝區是存儲要寫入磁盤上的日誌文件的數據的內存區域。默認16MB。數據庫
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。服務器
前提是表是由innode_file_per_table tablespace建立。數據結構
必須至少是索引的一部分ide
聚簇索引存儲行數據,聚簇索引和主鍵是一致的。
沒有定義主鍵或者沒有合適的惟一索引,InnoDB內部在包含row id值的合成列上生成一個名爲GEN_CLUST_INDEX的隱藏集羣索引。這個row id佔用6個字節。
二級索引包含主鍵值,經過主鍵值查找聚簇索引。
除了空間索引是R-tree結構,其餘的InnoDB索引都是B-tree結構,索引記錄都存在樹的葉子節點上,默認一個索引頁大小16kb。索引記錄是有序存儲的,這樣可讓索引頁15/16的空間是利用的,1/16的空間給索引增長預留。
index bulid分爲三個階段
- 第一階段:掃描彙集索引,生成索引條目並將其添加到排序緩衝區。當排序緩衝區滿時,條目將被排序並寫入臨時中間文件。這個過程也稱爲「run」。
- 第二階段:將一個或多個run寫入臨時中間文件,對文件中的全部條目執行合併排序。
- 第三階段:排序後的條目被插入到B-tree中。