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