Artikel ini akan membawa anda melalui struktur storan logik InnoDB, saya harap ia akan membantu anda!
Dalam InnoDB, jadual yang kami cipta dan data indeks yang sepadan disimpan dalam sambungan Dalam .ibd, laluan fail ini boleh diperolehi dengan menyemak pembolehubah mysql datadir
dahulu, dan kemudian memasukkan direktori nama pangkalan data yang sepadan Anda akan melihat banyak ibd Nama fail ialah nama jadual . Ruang meja kongsi (atau ruang jadual sistem) dan fail ruang meja bebas. [Cadangan berkaitan: tutorial video mysql]
Untuk ruang jadual kongsi, semua data jadual dan indeks yang sepadan disimpan di sini, manakala ruang jadual bebas ialah data dan indeks setiap jadual semua disimpan dalam fail ibd yang berasingan Dalam versi MySQL semasa, ruang jadual bebas digunakan secara lalai.
Nama fail ruang jadual kongsi boleh diperolehi melalui 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)
Ruang jadual bebas dan kongsi boleh ditukar melalui innodb_file_per_table
Data diletakkan dalam fail ruang jadual yang berasingan Ia juga harus diperhatikan bahawa ruang jadual setiap jadual hanya menyimpan data dan indeks lain, seperti maklumat rollback, maklumat transaksi sistem dan penimbal tulis sekunder disimpan dalam bahagian asal dalam ruang meja.
Pernyataan berikut boleh menyemak status 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)
Ubah suai status innodb_file_per_table
set global innodb_file_per_table=0;
Jika innodb_file_per_table
bersamaan dengan 0, iaitu apabila OFF, jadual yang dibuat akan disimpan dan dikongsi oleh sistem Dalam ruang jadual, seperti contoh berikut.
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
Anda boleh mendapati tiada fail ibd baharu dibuat selepas ditutup.
Ruang jadual terdiri daripada segmen, keluasan dan halaman, memperkenalkan gambar rangkaian.
Ruang jadual terdiri daripada segmen Ia adalah struktur logik yang digunakan untuk mengurus fail fizikal Segmen termasuk segmen data, segmen indeks dan segmen rollback Setiap segmen terdiri daripada N kawasan dan 32 halaman bertaburan.
Jadual enjin storan InnoDB disusun mengikut indeks, jadi data ialah indeks, dan indeks ialah data Biasanya, apabila membuat indeks, dua segmen akan dibuat, iaitu segmen nod bukan daun dan daun segmen nod.
adalah ruang yang terdiri daripada halaman berterusan Dalam apa jua keadaan, saiz setiap kawasan ialah 1MB. Untuk memastikan kesinambungan halaman dalam rantau, enjin storan InnoDB digunakan untuk 4-5 kawasan daripada cakera pada satu masa. Secara lalai, saiz halaman enjin storan InnoDB ialah 16KB, bermakna terdapat 64 halaman berturut-turut, 16*64=1024=1M.
Versi InnoDB1.2.x menambah parameter innodb_page_size
, yang membenarkan menetapkan saiz halaman lalai kepada 4K, 8K,
Halaman ialah unit terkecil bagi pengurusan cakera enjin storan InnoDB. Saiz halaman boleh ditetapkan kepada 4K, 8K atau 16K melalui parameter innodb_page_size
. InnoDB telah mereka bentuk banyak jenis halaman untuk mencapai tujuan yang berbeza jenis halaman biasa dalam enjin storan InnoDB ialah:
halaman data
buat asal Halaman.
Halaman sistem
Halaman data transaksi (halaman sistem perdagangan)
Sisipkan imej bit penimbal halaman
Masukkan halaman senarai bebas penimbal
Halaman gumpalan tidak termampat
Halaman Objek Besar Binari Termampat
Anda boleh melihat saiz melalui arahan berikut.
mysql> show status like 'innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec) mysql>
Berikut ialah struktur halaman data InnoDB, yang terdiri daripada tujuh bahagian.
名称 | 作用 |
---|---|
File header | 记录了页头的一些信息,cheksum、Ppervious和next page的记录 |
Page header | 记录了页的状态信息和存储信息、首个记录的position |
Infimum supremum | InnoDB每个数据页有两个虚拟行记录,用来限定记录边界 |
Row records | 实际存储的行数据信息 |
Free space | 空闲空间,同样是链表结构 |
Page directory | 存放了记录的相对位置 |
File trailer | innodb利用它来保证页完整地写入磁盘 |
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听风逝夜
更多编程相关知识,请访问:编程视频!!
Atas ialah kandungan terperinci Pelajari MySQL secara mendalam dan fahami struktur storan logik InnoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!