來源
MySQL的幾個存儲引擎如InnoDB和MyISAM都是將數據存儲到磁盤上,而我們的操作系統是通過文件系統來管理磁盤的,所以可以說這幾個存儲引擎都是將表存儲在文件系統上的,而我們通過操作文件系統來讀寫數據。
定義
數據目錄存儲MySQL服務器在運行過程重產生的數據,且在服務器程序啟動時會從這個目錄下加載一些文件。與安裝目錄不同,安裝目錄存儲了許多控制服務器和客戶端程序的命令。
結構
通過語句 SHOW VARIABLES LIKE 'datadir'; 可查看數據目錄地址。
如下圖為這個數據目錄下的內容,information_schema比較特殊,沒有使用相應的數據庫目錄
已知數據目錄位置,我們創建的數據庫就會在該文件夾下面生成一個同名子目錄,並在這個子目錄下創建一個名為db.opt的文件,這個文件包含該數據庫的各種屬性,如字符集/比較規則等
如下圖為數據庫tcc目錄下的內容,它包含表結構的定義和表數據
不同的存儲引擎存儲表數據不同
-
InnoDB
-
頁為基本單位管理存儲空間
-
索引對應一顆B+樹,B+樹每個節點對應一個數據頁
-
InnoDB提出表空間/文件空間的概念來對應文件系統上一個或多個真實文件,我們的表數據就存放在某個表空間下的某些頁里
- 系統表空間:存儲於數據目錄下名為ibdata1,是個自擴展文件,可通過修改配置文件修改其位置大小;系統表空間在一個MySQL服務器中只有一份,MySQL5.5.7-5.6.6版本之間,表中數據默認存儲到這個系統表空間
- 獨立表空間:MySQL5.6.6版本之后InnoDB不會默認將表數據(數據+索引)存儲到系統表空間而是單獨為每一個表創建一個獨立表空間,存儲於每個數據庫目錄下以.ibd為擴展名;
- 可通過配置innodb_file_per_table=0孔子數據存儲到系統表空間,1為存儲到獨立表空間,若想將原來的數據遷移到系統/獨立表空間可使用語句ALTER TABLE 表名 TABLESPACE [=] innodb_system;系統表空間只存放一些系統數據,獨立表空間只存放這個表的數據
- 其他類型的表空間.......
-
-
MyISAM
- MyISAM的索引全是二級索引,且數據和索引是分開存儲的,所以使用不同的文件來存儲數據文件和索引文件
- 沒有表空間,表數據存儲到對應的數據庫子目錄下,.MYD代表數據文件,.MYI代表索引文件
視圖
MySQL中的視圖其實是虛擬的表,所以存儲視圖不需要存儲真實數據,只要存儲其結構,以.frm文件存儲到數據庫對應的目錄下;8.0版本之后就沒有.frm文件了
其他文件
數據目錄下還存放一些其他的文件以更好的運行程序
- 服務器進程文件
- 服務器日志文件
- 默認/自動生成的SSL和RSA證書和密鑰文件
InnoDB的表空間
- 獨立表空間結構
- 系統表空間結構
表空間被划分為許多連續的區
extent,每個區默認由64個頁組成,每256個區划分為一組,每個組的最開始的幾個頁面類型是固定的。