MySQL中的物理存儲(chǔ)結(jié)構(gòu)詳解
MySQL的物理存儲(chǔ)結(jié)構(gòu)主要由數(shù)據(jù)文件、日志文件及存儲(chǔ)引擎特定的組織方式構(gòu)成。以下是其核心組成部分的詳細(xì)說(shuō)明:
1. 數(shù)據(jù)目錄結(jié)構(gòu)
MySQL的數(shù)據(jù)存儲(chǔ)在datadir
配置指定的目錄中,通常包含以下內(nèi)容:
數(shù)據(jù)庫(kù)目錄:每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)子目錄(如/var/lib/mysql/db_name
),內(nèi)部存放表的結(jié)構(gòu)和數(shù)據(jù)文件。
表文件:不同存儲(chǔ)引擎的表文件類型不同:
- InnoDB:
.ibd
(獨(dú)立表空間文件)和.frm
(8.0之前的結(jié)構(gòu)文件,8.0后元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)字典中)。 - MyISAM:
.MYD
(數(shù)據(jù)文件)、.MYI
(索引文件)和.frm
(結(jié)構(gòu)文件)。 - Memory引擎:數(shù)據(jù)僅存儲(chǔ)在內(nèi)存中,無(wú)磁盤文件(表結(jié)構(gòu)仍存于
.frm
)。
2. InnoDB存儲(chǔ)引擎的物理結(jié)構(gòu)
InnoDB采用索引組織表(IOT),數(shù)據(jù)按主鍵順序存儲(chǔ),物理結(jié)構(gòu)分層如下:
表空間(Tablespace)
- 系統(tǒng)表空間(ibdata1):存儲(chǔ)數(shù)據(jù)字典、Undo日志(8.0前)、Change Buffer等。默認(rèn)包含所有表的數(shù)據(jù)(若未啟用獨(dú)立表空間)。
- 獨(dú)立表空間(.ibd文件):每個(gè)表獨(dú)立存儲(chǔ)數(shù)據(jù)和索引(默認(rèn)啟用),提升管理靈活性。
- 通用表空間:可存儲(chǔ)多個(gè)表的數(shù)據(jù),通過(guò)
CREATE TABLESPACE
創(chuàng)建。 - Undo表空間(8.0+):獨(dú)立存儲(chǔ)Undo日志,默認(rèn)
undo_001
和undo_002
。 - 臨時(shí)表空間:存儲(chǔ)臨時(shí)表和排序操作數(shù)據(jù)。
存儲(chǔ)單元層級(jí)
- 段(Segment):由多個(gè)區(qū)組成(如數(shù)據(jù)段、索引段、回滾段)。
- 區(qū)(Extent):由連續(xù)64個(gè)頁(yè)構(gòu)成(默認(rèn)1MB,每頁(yè)16KB)。
- 頁(yè)(Page):最小磁盤管理單元(16KB),包含頁(yè)頭、行記錄、頁(yè)尾等信息。
- 行(Row):數(shù)據(jù)按行格式(如Compact、Dynamic)存儲(chǔ),Dynamic格式處理大字段時(shí)僅存儲(chǔ)溢出頁(yè)指針。
日志文件
- Redo Log(ib_logfile)*:物理日志,記錄數(shù)據(jù)頁(yè)修改,用于崩潰恢復(fù)。
- Undo Log:邏輯日志,支持事務(wù)回滾和MVCC(8.0后存于Undo表空間)。
3. MyISAM存儲(chǔ)引擎的物理結(jié)構(gòu)
數(shù)據(jù)與索引分離:表由三個(gè)文件組成:
.frm
:表結(jié)構(gòu)定義(8.0前)。.MYD
:數(shù)據(jù)文件,按插入順序存儲(chǔ)。.MYI
:索引文件,支持全文索引和壓縮表。
特性:表級(jí)鎖、無(wú)事務(wù)支持,適合讀多寫少場(chǎng)景。
4. 日志文件
- 二進(jìn)制日志(binlog):記錄所有數(shù)據(jù)更改操作,用于主從復(fù)制和點(diǎn)恢復(fù)。
- 錯(cuò)誤日志(error log):記錄服務(wù)器運(yùn)行狀態(tài)和錯(cuò)誤信息。
- 慢查詢?nèi)罩荆╯low query log):記錄執(zhí)行時(shí)間超過(guò)閾值的SQL語(yǔ)句。
5. 內(nèi)存結(jié)構(gòu)輔助
- 緩沖池(Buffer Pool):InnoDB緩存數(shù)據(jù)頁(yè)和索引,減少磁盤I/O。
- Change Buffer:緩存非唯一索引的變更,提升寫入性能。
版本差異與注意事項(xiàng)
- MySQL 8.0+:移除
.frm
文件,元數(shù)據(jù)存于數(shù)據(jù)字典(mysql.ibd
);默認(rèn)Undo日志獨(dú)立。 - 配置選項(xiàng):
innodb_file_per_table
控制是否啟用獨(dú)立表空間。 - 行溢出處理:Dynamic行格式對(duì)大字段(如BLOB)僅存儲(chǔ)20字節(jié)指針,數(shù)據(jù)存于溢出頁(yè)。
總結(jié)
- InnoDB:適合事務(wù)處理,通過(guò)表空間、頁(yè)結(jié)構(gòu)和日志機(jī)制保障ACID。
- MyISAM:輕量級(jí),適合靜態(tài)數(shù)據(jù),物理結(jié)構(gòu)簡(jiǎn)單但缺乏事務(wù)支持。
- 日志系統(tǒng):保障數(shù)據(jù)持久性和系統(tǒng)可恢復(fù)性。
理解物理存儲(chǔ)結(jié)構(gòu)有助于優(yōu)化數(shù)據(jù)庫(kù)設(shè)計(jì)(如選擇行格式、分區(qū)策略)和故障排查(如分析文件損壞問(wèn)題)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)樹節(jié)點(diǎn)的獲取方法
這篇文章主要介紹了mysql 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)樹節(jié)點(diǎn)的獲取方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06SQL中寫入包含有英文單引號(hào)“ '''' ”失敗問(wèn)題深入詳解
這篇文章主要介紹了SQL中寫入包含有英文單引號(hào)“ ' ”失敗問(wèn)題深入詳解,列舉了具體實(shí)例講解,有感興趣的同學(xué)可以研究下2021-03-03關(guān)于Mysql查詢帶單引號(hào)及插入帶單引號(hào)字符串問(wèn)題
本文主要介紹的是用mysql_real_escape_string對(duì)用戶提交的表單數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理和通過(guò)addslashes以及mysql_escape_string這3個(gè)類似功能的函數(shù)用法區(qū)別2013-04-04mysql多表join時(shí)候update更新數(shù)據(jù)的方法
如果item表的name字段為''就用resource_library 表的resource_name字段前面加上字符串Review更新它,他們的關(guān)聯(lián)關(guān)系在表resource_review_link中。2011-03-03MySQL中的物理存儲(chǔ)結(jié)構(gòu)詳解
這篇文章主要介紹了MySQL中的物理存儲(chǔ)結(jié)構(gòu)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03MySQL表數(shù)據(jù)文件損壞導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)的原因與解決方案
在日常的數(shù)據(jù)庫(kù)管理中,遇到MySQL表數(shù)據(jù)文件損壞的情況并不罕見,這種情況下,MySQL數(shù)據(jù)庫(kù)可能會(huì)無(wú)法正常啟動(dòng),給業(yè)務(wù)運(yùn)行帶來(lái)嚴(yán)重影響,本文將探討如何診斷和解決MySQL表數(shù)據(jù)文件損壞導(dǎo)致的數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)問(wèn)題,需要的朋友可以參考下2025-03-03MySQL數(shù)據(jù)庫(kù)三種常用存儲(chǔ)引擎特性對(duì)比
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或內(nèi)存)中,這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制,索引技巧,鎖定水平并且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術(shù)及配套的相關(guān)功能稱為存儲(chǔ)引擎。2016-01-01MySQL中的自定義函數(shù)(CREATE FUNCTION)
這篇文章主要介紹了MySQL中的自定義函數(shù)(CREATE FUNCTION),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06