深入學習MySQL,了解InnoDB的邏輯儲存結構

青灯夜游
發布: 2021-12-10 19:20:21
轉載
2134 人瀏覽過

這篇文章帶大家了解一下InnoDB邏輯儲存結構,希望對大家有幫助!

深入學習MySQL,了解InnoDB的邏輯儲存結構

InnoDB邏輯儲存結構

#在InnoDB中我們建立的資料表還有對應的索引資料都儲存在副檔名為.ibd 的檔案中,這個檔案路徑可以先透過查mysql變數datadir來得到,然後進入對應的資料庫名稱目錄,會看到很多ibd,檔案名稱就是表名,這裡有兩種類型的表空間,共享表空間(或稱為系統表空間)和獨立表空間檔。 【相關推薦:mysql影片教學

對於共享表空間,所有的表資料和對應索引都存放在這裡,而獨立表空間,就是每個表的資料和索引都存放在一個單獨的ibd檔案中,在目前的MySQL版本中,預設都是使用的獨立表空間。

共享表空間檔案名稱可以透過innodb_data_file_path得到,

mysql> show variables like 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.00 sec)
登入後複製

獨立和共享表空間可以透過innodb_file_per_table切換,如果啟用了他,那麼每張表內的數據就單獨放在一個表空間文件中,還需要注意,每個表的表空間只存儲數據、索引,其他類的數據,如回滾信息、系統事務資訊、二次寫緩衝仍儲存在原始共用表空間中。

下面語句可以查看innodb_file_per_table的狀態。

mysql> show variables like '%innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)
登入後複製

修改innodb_file_per_table狀態

set global innodb_file_per_table=0;
登入後複製

如果在innodb_file_per_table等於0的情況下,也就是OFF關閉情況下,建立的表都會存放的系統共享的表空間中,例如下面的列子。

1.创建database_1数据库
mysql> create  database database_1;
Query OK, 1 row affected (0.02 sec)

2. 当前状态
mysql> show variables like '%innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)

3. 创建表
mysql> create table t1(id int(11));
Query OK, 0 rows affected, 1 warning (0.05 sec)


4. 查看ibd文件
root@hxl-PC:/var/lib/mysql/database_1# ls
t1.ibd
root@hxl-PC:/var/lib/mysql/database_1# 

5. 关闭innodb_file_per_table后在创建表
mysql> set global innodb_file_per_table=0;
Query OK, 0 rows affected (0.01 sec)

mysql> create table t2(id int(11));
Query OK, 0 rows affected, 1 warning (0.05 sec)
6. 查看ibd文件
root@hxl-PC:/var/lib/mysql/database_1# ls
t1.ibd
登入後複製

可以發現在關閉後,沒有建立新的ibd檔。

表格空間又由段(segment)、區(extent)、頁(page)組成,引入一張網路圖片。

深入學習MySQL,了解InnoDB的邏輯儲存結構

1.段

表空間由段組成,他是一個邏輯結構,用來管理物理文件,常見的段有資料段、索引段、回滾段,每個段由N個區和32個零散的頁組成。

InnoDB儲存引擎表是索引組織的,所以數據就是索引,索引就是數據,通常情況下,創建一個索引的同時就會創建兩個段,分別為非葉子節點和葉子節點段。

2.區

區是由連續的頁組成的空間,無論如何,每個區的大小都是1MB。為了確保區域內頁面的連續性,InnoDB儲存引擎一次從磁碟申請4-5個區域。預設情況下,InnoDB儲存引擎的頁面大小為16KB,也就是有64個連續頁面,16*64=1024=1M。

InnoDB1.2.x版本增加了參數innodb_page_size#,這個參數允許設定預設頁大小為4K、8K,

3.頁

頁是InnoDB儲存引擎磁碟管理的最小單位,預設為16kb,可以透過參數innodb_page_size設定頁大小為4K、8K、16K 。 InnoDB為了實現不同的目的而設計了許多種頁,InnoDB 儲存引擎中常見的頁面類型有:

  • 資料頁

  • ##undo頁面

  • 系統頁面

  • 事物資料頁面(交易系統頁面)

  • 插入緩衝位圖頁

  • 插入緩衝區空閒列表頁

  • 未壓縮的二進位大物件頁面

  • 壓縮二進位大物件頁面

可以透過以下命令查看大小。

mysql> show status like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

mysql>
登入後複製

下面是InnoDB資料頁結構,它由七個部分組成。

深入學習MySQL,了解InnoDB的邏輯儲存結構

#名稱## File headerPage headerInfimum supremum#Row records#Free spacePage directory
記錄了頁頭的一些訊息,cheksum、Ppervious和next page的記錄
#記錄了頁的狀態訊息和儲存資訊、首個記錄的position
InnoDB每個資料頁有兩個虛擬行記錄,用來限定記錄邊界
實際儲存的行資料資訊
空閒空間,也是鍊錶結構
存放了記錄的相對位置############File trailer######innodb利用它來保證頁完整地寫入磁碟############

4.行

InnoDB存储引擎是面向行的,页里面又记录着行记录的信息,也就是数据是按照行存储的。行记录数据又是按照行格式进行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200行,也就是7992行。

InnoDB存储引擎有两种文件格式,一种叫Antelops,另外一种叫Barracuda。

在Antelope文件格式下,有compact和redundant两种行记录格式。

在Barracuda文件格式下,有compressed和dynamic两种行记录格式。

可以通过以下方式查看当前格式,其中Row_format就是对应行格式存储类型。

mysql> show table status \G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 15
 Avg_row_length: 1092
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2021-08-24 09:43:29
    Update_time: 2021-08-24 14:43:35
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options: 
        Comment:
登入後複製

原文地址:https://juejin.cn/post/6999936914119720996

作者:i听风逝夜

更多编程相关知识,请访问:编程视频!!

以上是深入學習MySQL,了解InnoDB的邏輯儲存結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!