InnoDB 將資料表資料與索引儲存在按表空間組織的頁面中。表空間具有固定頁面大小,在初始化資料目錄時選定。預設頁面大小為 16 KiB。以頁面為導向的 I/O 解釋了為何索引區域性、緩衝池容量與資料列寬度會影響查詢成本。
資料字典與中繼資料 #
MySQL 8 將交易資料字典儲存在 InnoDB 中。因此,包含結構描述、資料表、欄位、索引、儲存程式與權限在內的伺服器中繼資料具備當機安全性,並參與原子資料定義操作。應用程式必須使用 INFORMATION_SCHEMA、Performance Schema 或 SHOW 陳述式檢查中繼資料;內部字典資料表不是應用程式介面。
INFORMATION_SCHEMA 公開中繼資料上的 SQL 檢視。sys 結構描述則在 Performance Schema 與 Information Schema 資料上加入面向人員的檢視,例如昂貴陳述式與未使用索引。
當操作支援原子 DDL 時,資料定義操作會在單一原子 DDL 交易中更新字典中繼資料與儲存引擎狀態。字典記錄屬於伺服器內部;直接讀取或修改底層 InnoDB 資料表不受支援。
表空間 #
InnoDB 安裝可以使用:
- 系統表空間,用於變更緩衝資料與其他共享 InnoDB 結構。
- 每資料表檔案表空間,啟用
innodb_file_per_table時為 InnoDB 資料表建立。 - 一般表空間,由管理員建立並指派給相容資料表。
- 由 InnoDB 管理的獨立復原與暫存表空間。
在所有設定中,資料表都不會安全地對應至單一作業系統檔案。備份與還原必須使用 MySQL 感知工具或記錄完整的實體備份程序,因為一致的資料庫橫跨資料檔案、重做記錄與中繼資料。
頁面、範圍與索引記錄 #
表空間分割成頁面,而頁面分組成範圍。在預設 16 KiB 頁面大小下,一個範圍包含 64 個頁面,佔用 1 MiB。InnoDB 會在成長過程中先逐頁配置小型區段,再使用完整範圍。
每個資料表都圍繞其叢集索引組織。叢集葉頁包含資料列記錄,內部頁面則包含分隔鍵與子頁面指標。次要索引葉記錄包含次要鍵,以及用來定位叢集記錄的主鍵。復原頁面保留 MVCC 所需的舊資料列版本,而內部暫存資料表則依其種類與發行版本,可使用全域暫存表空間或工作階段暫存表空間。
雙寫緩衝區與復原 #
InnoDB 會先透過雙寫機制寫入髒頁,再進行最終表空間寫入。否則儲存裝置故障可能留下部分寫入的頁面,稱為撕裂頁面。在復原期間,當頁面檢查總和識別出撕裂的最終寫入時,InnoDB 可以使用有效的雙寫副本。
重做記錄會在受影響頁面排清前記錄變更。當機復原期間,InnoDB 會重播必要的重做記錄,並使用復原記錄回滾未完成的交易。停用持久性設定會改變已確認寫入的語意,必須視為資料遺失決策,而不是只涉及效能的調校選擇。
檢查 #
請使用受支援的結構描述,而不是檔案檢查:
SELECT name, space_type
FROM information_schema.innodb_tablespaces
ORDER BY name;
SELECT pool_id, pool_size, free_buffers, database_pages
FROM information_schema.innodb_buffer_pool_stats;
SELECT event_name, count_star, sum_timer_wait
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE event_name LIKE 'wait/io/file/innodb/%';INFORMATION_SCHEMA.INNODB_* 資料表描述邏輯 InnoDB 物件與緩衝區狀態。Performance Schema 則提供觀察到的工作與等待屬性。兩種介面都會跨發行版本變更,因此營運查詢必須針對已部署的 MySQL 版本。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)