Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情
前言
在Linux中采用文件系統(tǒng)管理磁盤,而Mysql常用的存儲引擎如InnoDB、MyISAM采用的是文件存儲,自然和文件系統(tǒng)掛鉤,那么Mysql都有哪些地方用到了文件系統(tǒng)呢?下面聊聊
Mysql數(shù)據(jù)目錄
Mysql系統(tǒng)啟動文件(默認my.cnf)中可能會指定Mysql的一個全局系統(tǒng)變量datadir,這個變量可以指定Mysql的數(shù)據(jù)存儲目錄,
如下:
或者采用查詢變量的形式獲取(下面所有演示截圖都是從這個目錄出發(fā))
mysql> show variables like '%datadir%'; +---------------+-------------------------------+ | Variable_name | Value | +---------------+-------------------------------+ | datadir | /usr/local/mysql-5.7.26/data/ | +---------------+-------------------------------+ 1 row in set (0.00 sec)
數(shù)據(jù)目錄相關(guān)結(jié)構(gòu)
數(shù)據(jù)庫存儲結(jié)構(gòu)
每創(chuàng)建完一個數(shù)據(jù)庫會在預(yù)定義的datadir路徑下創(chuàng)建一個以數(shù)據(jù)庫名同名的文件夾
mysql> create database test_data; Query OK, 1 row affected (0.00 sec)
創(chuàng)建完test_data文件夾,會在該文件夾下創(chuàng)建一個db.opt的文件,該文件用于存放數(shù)據(jù)庫的屬性如字符集和比較規(guī)則。
有一點我們需要注意系統(tǒng)自帶的數(shù)據(jù)庫有四個分別是mysql(存儲Mysql用戶權(quán)限等信息)、information_schema(其它數(shù)據(jù)庫描述信息)、performance_schema(存儲Mysql運行時狀態(tài)等)、sys(服務(wù)器性能視圖),其中除information_schema外都會創(chuàng)建一個文件夾。
表結(jié)構(gòu)存儲
如給上述創(chuàng)建的test_data數(shù)據(jù)庫新建一個表
CREATE TABLE test_table ( name varchar(100) DEFAULT NULL ) ENGINE=InnoDB
那么Mysql會在數(shù)據(jù)庫同名文件夾也就是test_data上新建一個同表名的文件test_table.frm,這個文件用于描述表的字段,索引、約束等等
表數(shù)據(jù)存儲
表數(shù)據(jù)存儲不同的存儲引擎,存儲文件是不同的,以常用InnoDB和MyISAM舉例。
InnoDB存儲引擎表數(shù)據(jù)存儲
InnoDB存儲引擎都是以頁為單位管理存儲空間的,一個數(shù)據(jù)頁的大小為16k,而InnoDB為了方便管理引入表空間的概念,一個表空間中可能包含多個數(shù)據(jù)頁,當(dāng)然表空間又分為幾種如下。
系統(tǒng)表空間
從Mysql版本5.5.7到5.6.6之間的版本默認將表數(shù)據(jù)放入系統(tǒng)表空間中,在默認情況下數(shù)據(jù)目錄的位置會自動生成一個文件名為ibdata1的文件,該文件大小為12M,
如下;
這個文件的大小并不是固定的,可以自增長,這意味著該文件存儲不下時可以自動擴充大小。
獨立表空間
在Mysql版本從5.6.6后不再存儲到系統(tǒng)表空間,而是存儲到獨立表空間,獨立意味著表與表之間的數(shù)據(jù)獨立開來,Mysql會為每一個表建立一個獨立的空間,有多少個表就有多少個獨立空間,所以當(dāng)我們執(zhí)行建表語句
-- 默認InnoDB存儲引擎 CREATE TABLE test_table ( name varchar(100) DEFAULT NULL ) ENGINE=InnoDB
會在當(dāng)前數(shù)據(jù)庫同名的目錄下新建一個同表名的idb文件:
至于用戶想選擇系統(tǒng)表空間還是獨立表空間可以由用戶自己決定,通過修改系統(tǒng)變量innodb_file_per_table
就可以實現(xiàn),為0表示使用系統(tǒng)表空間,為1表示使用獨立表空間,這里需要注意的是修改該系統(tǒng)參數(shù)只對新建表生效,至于修改系統(tǒng)參數(shù)之前的表需要手動修改。
MyISAM存儲引擎表數(shù)據(jù)存儲
MyISAM的存儲引擎和InnoDB存儲引擎在文件系統(tǒng)上的最大區(qū)別就是MyISAM將索引和數(shù)據(jù)文件分開,InnoDB強調(diào)的是索引既數(shù)據(jù),就是因為這樣所以MyISAM存儲引擎的表由三個文件描述
- 表名.frm:描述表結(jié)構(gòu),索引,約束等。
- 表名.MYD:存儲表數(shù)據(jù)。
- 表名.MYI:存儲表索引。
如下創(chuàng)建測試表:
CREATE TABLE `test_table_myisam` ( `name` varchar(100) DEFAULT NULL ) ENGINE=MyISAM
特殊視圖存儲
create view view_test as select * from test_table;
因為視圖本質(zhì)就是虛擬表,僅僅是查詢語句的別名,存儲時不保存視圖的數(shù)據(jù),僅僅只保存視圖的表結(jié)構(gòu),所以創(chuàng)建視圖僅僅會創(chuàng)建一個與視圖同名的frm文件。
到此這篇關(guān)于Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情的文章就介紹到這了,更多相關(guān)Mysql文件系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql字符串截取及獲取指定字符串中的數(shù)據(jù)
小編童鞋最近接了一個新需求,需要在MySql的字段中截取一段字符串中的特定字符,下面小編把我的核心代碼分享給大家,對mysql 字符串截取相關(guān)知識感興趣的朋友一起看看吧2019-11-11MySQL錯誤提示:sql_mode=only_full_group_by完美解決方案
有時候遇到數(shù)據(jù)庫重復(fù)數(shù)據(jù),需要將數(shù)據(jù)進行分組,并取出其中一條來展示,這時就需要用到group by語句,下面這篇文章主要給大家介紹了關(guān)于MySQL錯誤提示:sql_mode=only_full_group_by的完美解決方案,需要的朋友可以參考下2022-10-10MySQL 中 blob 和 text 數(shù)據(jù)類型詳解
本文主要介紹了MySQL中blob和text數(shù)據(jù)類型詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02linux下perl操作mysql數(shù)據(jù)庫(需要安裝DBI)
有時候需要perl操作mysql數(shù)據(jù)庫,可以通過DBI實現(xiàn),需要的朋友可以參考下2012-05-05MySQL數(shù)據(jù)庫安全秘籍之守護數(shù)據(jù)金庫防火防盜防攻擊
MySQL是許多公司和組織的關(guān)鍵數(shù)據(jù)庫,因此其安全性的重要性如此顯而易見,為了確保MySQL的安全性,需要采取多種措施來增強其安全性,本文給大家介紹MySQL數(shù)據(jù)庫安全秘籍之守護數(shù)據(jù)金庫防火防盜防攻擊,感興趣的朋友一起看看吧2023-03-03