mysql 學習 - 數據與文件系統的關系解讀


本篇已收錄在 MySQL 是怎樣運行的 學習筆記系列

數據庫和文件系統的關系

什么是文件系統, 操作系統用來管理磁盤的被稱為文件系統

像 InnoDB 、 MyISAM 這樣的存儲引擎都是把表存儲在文件系統上的。當我們想讀取數據的時候,這些存儲引擎會從文件系統中把數據讀出來返回給我們,當我們想寫入數據的時候,這些存儲引擎會把這些數據又寫回文件系統。

MySQL數據目錄

MySQL服務器程序在啟動時會到文件系統的某個目錄下加載一些文件,之后在運行過程中產生的數據也都會存儲到這個目錄下的某些文件中,這個目錄就稱為數據目錄.

數據庫對應文件系統的存儲結構

使用CREATE DATABASE [數據庫名]語句創建一個數據庫的時候,在文件系統上實際發生了什么呢?其實很簡單,每個數據庫都對應數據目錄下的一個子目錄,或者說對應一個文件夾,我們每當我們新建一個數據庫時,MySQL會幫我們做這兩件事兒:

在數據目錄下創建一個和數據庫名同名的子目錄(或者說是文件夾)。
在該與數據庫名同名的子目錄下創建一個名為db.opt的文件,這個文件中包含了該數據庫的各種屬性,比方說該數據庫的字符集和比較規則是個啥。

表對應文件系統的存儲結構

我們的數據其實都是以記錄的形式插入到表中的,每個表的信息其實可以分為兩種:

表結構的定義.
表中的數據

表結構就是該表的名稱是啥,表里邊有多少列,每個列的數據類型是啥,有啥約束條件和索引,用的是啥字符集和比較規則吧啦吧啦的各種信息,這些信息都體現在了我們的建表語句中了。為了保存這些信息,InnoDB和MyISAM這兩種存儲引擎都在數據目錄下對應的數據庫子目錄下創建了一個專門用於描述表結構的文件,文件名是這樣:表名.frm, 這個后綴名為.frm是以二進制格式存儲的,我們直接打開會是亂碼的

表中數據對應文件系統的存儲結構

在這個問題上,不同的存儲引擎就產生了分歧了,下邊我們分別看一下InnoDB和MyISAM是用什么文件來保存表中數據的。

InnoDB是如何存儲表數據的

回顧一下 innodb 的實現原理:

為了更好的管理這些頁,InnoDB 提供了一個表空間或者文件空間.

系統表空間(system tablespace)

這個所謂的系統表空間可以對應文件系統上一個或多個實際的文件,默認情況下,InnoDB會在數據目錄下創建一個名為ibdata1,大小為12M的文件,這個文件就是對應的系統表空間在文件系統上的表示。

在一個MySQL服務器中,系統表空間只有一份。從 MySQL5.5.7 到 MySQL5.6.6 之間的各個版本中,我們表中的數據都會被默認存儲到這個系統表空間。

獨立表空間(file-per-table tablespace)

在MySQL5.6.6以及之后的版本中,InnoDB並不會默認的把各個表的數據存儲到系統表空間中,而是為每一個表建立一個獨立表空間,也就是說我們創建了多少個表,就有多少個獨立表空間。使用獨立表空間來存儲表數據的話,會在該表所屬數據庫對應的子目錄下創建一個表示該獨立表空間的文件,文件名和表名相同,只不過添加了一個.ibd的擴展名而已,所以完整的文件名稱長這樣:
表名.ibd.
.ibd文件就用來存儲表中的數據和索引。

MyISAM是如何存儲表數據的

MyISAM並沒有什么所謂的表空間一說,表數據都存放到對應的數據庫子目錄下分為三個文件:
test.frm
test.MYD
test.MYI
其中test.MYD代表表的數據文件,也就是我們插入的用戶記錄;test.MYI代表表的索引文件,我們為該表創建的索引都會放到這個文件中。

表中視圖對應文件系統的存儲結構

我們知道MySQL中的視圖其實是虛擬的表,也就是某個查詢語句的一個別名而已,所以在存儲視圖的時候是不需要存儲真實的數據的,只需要把它的結構存儲起來就行了。只會存儲一個視圖名.frm的文件

文件系統對數據庫的影響

因為MySQL的數據都是存在文件系統中的,就不得不受到文件系統的一些制約,這在數據庫和表的命名、表的大小和性能方面體現的比較明顯,比如下邊這些方面:

數據庫名稱和表名稱不得超過文件系統所允許的最大長度。
特殊字符的問題
文件長度受文件系統最大長度限制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM