MYSQL中COMPACT行格式的具體使用
MySQL 的數(shù)據(jù)存放在哪個(gè)文件?
當(dāng)我們輸入下面的命令之后:就可以看到 /var/lib/mysql
mysql> SHOW VARIABLES LIKE 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.00 sec)
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)時(shí), 都會(huì)在 /var/lib/mysql/ 目錄里面創(chuàng)建一個(gè)以 database 為名的目錄
在數(shù)據(jù)庫(kù)中創(chuàng)建表時(shí),
[root@root]#ls /var/lib/mysql/test db.opt t_test.frm t_test.ibd
總結(jié)(回答問(wèn)題): MySQL 5.6.6之后,mysql的數(shù)據(jù)默認(rèn)存放到 .ibd后綴的文件(獨(dú)占表空間文件) 中。
db.opt:用來(lái)存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)字符集和字符校驗(yàn)規(guī)則。
t_test.frm:t_test 的表結(jié)構(gòu)會(huì)保存在這個(gè)文件。在 MySQL 中建立一張表都會(huì)生成一個(gè).frm 文件,用來(lái)保存每個(gè)表的元數(shù)據(jù)信息的,主要包含表結(jié)構(gòu)定義。
t_test.ibd:t_test 的表數(shù)據(jù)會(huì)保存在這個(gè)文件。表數(shù)據(jù)既可以存在共享表空間文件(文件名:ibdata1)里,也可以存放在獨(dú)占表空間文件(文件名:表名字.ibd)。這個(gè)行為是由參數(shù) innodb_file_per_table 控制的,若設(shè)置了參數(shù) innodb_file_per_table 為 1,則會(huì)將存儲(chǔ)的數(shù)據(jù)、索引等信息單獨(dú)存儲(chǔ)在一個(gè)獨(dú)占表空間,從 MySQL 5.6.6 版本開(kāi)始,它的默認(rèn)值就是 1 了,因此從這個(gè)版本之后, MySQL 中每一張表的數(shù)據(jù)都存放在一個(gè)獨(dú)立的 .ibd 文件。
InnoDB 行格式有哪些?
InnoDB 提供了 4 種行格式:Redundant(冗余)、Compact(緊湊)、Dynamic(動(dòng)態(tài)) 和 Compressed(壓縮行)
Redundant:很古老的行格式, MySQL 5.0 版本之前用的行格式,現(xiàn)在基本沒(méi)人用了。
Compact: 是一種緊湊的行格式,設(shè)計(jì)的初衷就是為了讓一個(gè)數(shù)據(jù)頁(yè)中可以存放更多的行記錄,從 MySQL 5.1 版本之后,行格式默認(rèn)設(shè)置成 Compact。
Dynamic 和 Compressed 兩個(gè)都是緊湊的行格式,它們的行格式都和 Compact 差不多,因?yàn)槎际腔?Compact 改進(jìn)一點(diǎn)東西。從 MySQL5.7 版本之后,默認(rèn)使用 Dynamic 行格式。
其中 Dynamic 和 Compressed 與 Compact格式特別像
COMPACT 行格式長(zhǎng)什么樣?
(結(jié)構(gòu)如圖:來(lái)自小林coding)
記錄的額外信息
記錄的額外信息包含 3 個(gè)部分:變長(zhǎng)字段長(zhǎng)度列表、NULL 值列表、記錄頭信息。
1. 變長(zhǎng)字段長(zhǎng)度列表
表的一行數(shù)據(jù)中,找出類(lèi)型為 varchar的字段,并將其倒序存儲(chǔ)在 變長(zhǎng)字段長(zhǎng)度列表。
比如:表的一行數(shù)據(jù)中,varchar字段name為11,varchar字段phone是123。
那么這個(gè)行記錄的變長(zhǎng)字段長(zhǎng)度列表存儲(chǔ)樣式為 03 02
注意:
為什么「變長(zhǎng)字段長(zhǎng)度列表」的信息要按照逆序存放?
因?yàn)檫@樣可以 使得位置靠前的記錄的真實(shí)數(shù)據(jù)和數(shù)據(jù)對(duì)應(yīng)的字段長(zhǎng)度信息可以同時(shí)在一個(gè) CPU Cache Line 中,這樣就可以提高 CPU Cache 的命中率。
每個(gè)數(shù)據(jù)庫(kù)表的行格式都有「變長(zhǎng)字段字節(jié)數(shù)列表」嗎?
當(dāng)數(shù)據(jù)表沒(méi)有變長(zhǎng)字段的時(shí)候,比如全部都是 int 類(lèi)型的字段,這時(shí)候表里的行格式就不會(huì)有「變長(zhǎng)字段長(zhǎng)度列表」了
2. NULL 值列表
如果存在允許 NULL 值的列,則每個(gè)列對(duì)應(yīng)一個(gè)二進(jìn)制位(bit),二進(jìn)制位按照列的順序逆序排列。
二進(jìn)制位的值為
1
時(shí),代表該列的值為NULL。二進(jìn)制位的值為
0
時(shí),代表該列的值不為NULL。另外,NULL 值列表必須用整數(shù)個(gè)字節(jié)的位表示(1字節(jié)8位),如果使用的二進(jìn)制位個(gè)數(shù)不足整數(shù)個(gè)字節(jié),則在字節(jié)的高位補(bǔ)
0
。
注意:
每個(gè)數(shù)據(jù)庫(kù)表的行格式都有 NULL 值列表 嗎?
- NULL 值列表 不是必須的。
- 當(dāng)數(shù)據(jù)表的字段都定義成 NOT NULL 的時(shí)候,這時(shí)候表里的行格式就不會(huì)有 NULL 值列表了。
- 所以在設(shè)計(jì)數(shù)據(jù)庫(kù)表的時(shí)候,通常都是建議將字段設(shè)置為 NOT NULL,這樣可以至少節(jié)省 1 字節(jié)的空間(NULL 值列表至少占用 1 字節(jié)空間)。
NULL 值列表 是固定 1 字節(jié)空間嗎?如果這樣的話,一條記錄有 9 個(gè)字段值都是 NULL,這時(shí)候怎么表示?
- NULL 值列表 的空間不是固定 1 字節(jié)的。
- 當(dāng)一條記錄有 9 個(gè)字段值都是 NULL,那么就會(huì)創(chuàng)建 2 字節(jié)空間的 NULL 值列表,以此類(lèi)推。
記錄的真實(shí)數(shù)據(jù)
1. row_id
如果我們建表的時(shí)候指定了主鍵或者唯一約束列,那么就沒(méi)有 row_id 隱藏字段了。如果既沒(méi)有指定主鍵,又沒(méi)有唯一約束,那么 InnoDB 就會(huì)為記錄添加 row_id 隱藏字段。row_id不是必需的,占用 6 個(gè)字節(jié)。
2. trx_id
事務(wù)id,表示這個(gè)數(shù)據(jù)是由哪個(gè)事務(wù)生成的。 trx_id是必需的,占用 6 個(gè)字節(jié)。
3. roll_pointer
這條記錄上一個(gè)版本的指針。roll_pointer 是必需的,占用 7 個(gè)字節(jié)。
到此這篇關(guān)于MYSQL中COMPACT行格式的具體使用的文章就介紹到這了,更多相關(guān)MYSQL COMPACT行格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 使用 Performance Schema 定位和解決慢
本文介紹了如何使用MySQL的PerformanceSchema來(lái)定位和解決慢SQL查詢問(wèn)題,通過(guò)啟用PerformanceSchema并分析相關(guān)的系統(tǒng)表,可以收集到詳細(xì)的性能數(shù)據(jù),從而識(shí)別出影響性能的SQL語(yǔ)句,優(yōu)化策略包括優(yōu)化查詢語(yǔ)句、調(diào)整數(shù)據(jù)庫(kù)配置等2025-02-02mysql中g(shù)rant?all?privileges?on賦給用戶遠(yuǎn)程權(quán)限方式
這篇文章主要介紹了mysql中g(shù)rant?all?privileges?on賦給用戶遠(yuǎn)程權(quán)限方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04MySQL觸發(fā)器 Update觸發(fā)Insert失敗
這篇文章主要介紹了MySQL觸發(fā)器 Update觸發(fā)Insert失敗 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07mysql如何判斷同一字段是否有重復(fù)數(shù)據(jù)
這篇文章主要介紹了mysql如何判斷同一字段是否有重復(fù)數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05關(guān)于mysql中的json解析函數(shù)JSON_EXTRACT
這篇文章主要介紹了關(guān)于mysql中的json解析函數(shù)JSON_EXTRACT講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07mysql數(shù)據(jù)庫(kù)navicat數(shù)據(jù)同步時(shí)誤刪除部分?jǐn)?shù)據(jù)的解決
本文主要介紹了mysql數(shù)據(jù)庫(kù)navicat數(shù)據(jù)同步時(shí)誤刪除部分?jǐn)?shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04mysql觸發(fā)器實(shí)時(shí)檢測(cè)一條語(yǔ)句進(jìn)行備份刪除思路詳解
遇到過(guò)這樣一個(gè)需求,在一張表里會(huì)不時(shí)出現(xiàn) “違規(guī)” 字樣的字段,需要在出現(xiàn)這個(gè)字段的時(shí)候,把整行的數(shù)據(jù)刪掉,針對(duì)這個(gè)需求我們?cè)撊绾尾僮髂?,下面跟隨小編看下mysql觸發(fā)器實(shí)時(shí)檢測(cè)一條語(yǔ)句進(jìn)行備份刪除的解決思路,一起看看吧2021-09-09