? ? ? ?實際的業務系統開發中,使用MySQL數據庫,我們使用最多的當然是支持事務并發的InnoDB存儲引擎的這種表結構,下面我們介紹下InnoDB存儲引擎相關的知識點。
1-Innodb體系架構
? ? ?InnoDB存儲引擎有多個內存塊,可以認為這些內存塊組成了一個大的內存池,負責如下工作:
(1)維護所有進程/線程需要訪問的多個內部數據結構
(2)緩存磁盤上的數據,方便快速的讀取,同時在對磁盤文件的數據修改之前在這里緩存
(3)重做日志(redo log)緩沖
? ? ? ?后臺線程的主要作用是負責刷新內存池中的數據,保證緩沖池中的內存緩存是最近的數據。此外將已經修改的數據文件刷新到磁盤文件,同時保證在數據庫發生異常的情況下InnoDB能恢復到正常運行狀態。
? ? ? ?Master thread 是一個非常核心的后臺線程,主要負責將緩沖池中的數據異步刷新到磁盤,保證數據的一致性,包括臟頁的刷新、合并插入緩沖(insert buffer)、undo頁的回收。
? ? ? IO Thread InnoDB存儲引擎大量使用了AIO來處理寫IO請求,這樣可以極大的提高數據庫的性能。而IO thread工作主要負責這些IO請求的回調(call back)處理。
2-Innodb表
2.1-索引組織表
? ? ? ? 在InnoDB存儲引擎中,表都是根據主鍵順序組織存放的,這種存儲方式的表稱為索引組織表(index organized table)。在InnoDB存儲引擎表中,每張表都有個主鍵(Primary Key),如果在創建表時沒有顯示地定義主鍵,則InnoDB存儲引擎會安裝如下方式選擇或者創建主鍵。
(1)首先判斷表中是否有唯一索引,如果有,則該列即為主鍵
(2)如果不符合上述情況,InnoDB存儲引擎自動創建一個6字節大小的指針
當表中有多個非空唯一索引時,InnoDB存儲引擎將選擇第一個定義為非空唯一索引為主鍵。主鍵的選擇是根據定義索引的順序,而不是建表時列的順序。
2.2-InnoDB邏輯存儲結構
? ? ? ? ? 所有數據都被邏輯地存放在一個空間中,稱之為表空間(tablespace),表空間又是由段(segment)、區(extent)、頁(page)組成。頁在一些文檔中頁稱之為塊(block)。
共享表空間
? ? ? ?Innodb 將存儲的數據按照表空間(tablespace)進行存放,默認配置下,會有一個初始大小10M,名為:ibdata1的文件,這就是默認的表空間文件。
show variables like 'innodb_data_file_path';//查看共享表空間
生成文件默認是在data目錄下一個叫ibdata1的文件
當然也可以多路徑設置表空間:
innodb_data_file_path = /data1/db1/ibdata1:100M:autoextend; /data2/db2/ibdata2:100M:autoextend
放在不同的磁盤,可以平均磁盤負載,提高數據庫性能。
獨立表空間
show variables like 'innodb_file_per_table'; ?//mysql默認5.6.7后開啟
所在位置:在對應表所在的目錄 ?表名.ibd 文件
記錄數據:獨立的表空間,僅存儲該表的:數據,索引和插入緩沖BITMAP等信息。其余信息仍存儲在默認表空間。
段:常見的段有數據段、索引段、回滾段等。
區:區是由連續的頁組成的空間,在任何情況下每個區的大小都是1MB。為了保證區中頁的連續性,InnoDB存儲引擎一次從磁盤申請4-5個區。在默認的情況下,InnoDB存儲引擎頁的大小為16KB,即一個區一共有64個連續頁。區是InnoDB存儲引擎空間申請的最小單位。
頁:頁是InnoDB磁盤管理的最小單位。默認是16K。頁是InnoDB訪問的最小單位。
show variables like 'innodb_page_size'; ?innodb_page_size=16384(1024*16)
show variables like 'innodb_version';//查看InnoDB的版本號