【MySQL】lnnoDB存儲引擎你是怎么理解的?
InnoDB邏輯存儲單元主要分為表空間,段,區和頁
InnoDB所有的數據都是存放在表空間的,表空間又分為系統表空間和獨立表空間
Mysql5.7之后又多了臨時表空間和通用表空間
其中系統表空間,主要是以ibdata1來命名。
在安裝數據庫初始化數據庫時就是系統在創建一個ibddata1的表空間文件,它會存儲所有數據的信息以及回滾段(undo)的信息。
innodb_data_file_path 負責定義系統表空間的路徑,初始化大小,自動擴展策略,如下:
數據庫Mysql8中,ibdata1默認大小是12M
mysql> show variables like '%data_file%'; +----------------------------+------------------------+ | Variable_name | Value | +----------------------------+------------------------+ | innodb_data_file_path | ibdata1:12M:autoextend | | innodb_temp_data_file_path | ibtmp1:12M:autoextend | +----------------------------+------------------------+ 2 rows in set mysql>
1
2
3
4
5
6
7
8
9
10
數據庫默認的自動擴展大小是64M,如下:
innodb_autoextend_increment 默認是64M
mysql> show variables like '%auto %'; +----------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------+-------+ | auto_generate_certs | ON | | auto_increment_increment | 1 | | auto_increment_offset | 1 | | autocommit | ON | | automatic_sp_privileges | ON | | caching_sha2_password_auto_generate_rsa_keys | ON | | innodb_autoextend_increment | 64 | | innodb_autoinc_lock_mode | 2 | | innodb_stats_auto_recalc | ON | | sha256_password_auto_generate_rsa_keys | ON | | sql_auto_is_null | OFF | +----------------------------------------------+-------+ 11 rows in set
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> show variables like '%innodb_file_per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set
1
2
3
4
5
6
7
默認是開啟的,如果沒有開啟設置 innodb_file_per_table=1即可。
每個表都有自己的獨立表空間,可以實現表空間的轉移,回收表空間也特別的方便,不需要存儲在idbdata1中,獨立表空間文件存儲對應表的B+樹結構,索引以及插入緩沖等信息。 其余的信息還是存放在默認表空間里。
缺點在于每個表都有.frm 和.ibd 兩個文件描述符,如果單標增長過快,就容易出現性能問題。
共享表空間的數據和文件放在一起便于管理,但無法回收, 統計分析及日志類系統不太適合用共享表空間。
表空間是由段組成的,也可以把一個表理解為一個段。通常有數據段,回滾段,索引段等。
每個段由N個區和32個零散的頁組成,段空間擴展是以區為單位進行擴展。
一般情況下,創建一個索引的同時會創建兩個段,分別為非子葉節點段和子葉節點段。
一個表有4個段
區是由連續的頁組成的,是物理上連續分配的一段空間,每個區的大小固定為1M, 區等于64個頁,也就是64*16kb=1M
innodb的最小物理存儲分配單位是page,有數據頁,回滾頁,一般情況下,一個區由64個連續的頁組成,頁默認大小為16KB,如下表:
innodb_page_size 16384
mysql> show variables like '%page %'; +--------------------------------------+-----------+ | Variable_name | Value | +--------------------------------------+-----------+ | innodb_doublewrite_pages | 4 | | innodb_log_compressed_pages | ON | | innodb_max_dirty_pages_pct | 90.000000 | | innodb_max_dirty_pages_pct_lwm | 10.000000 | | innodb_page_cleaners | 1 | | innodb_page_size | 16384 | | innodb_stats_persistent_sample_pages | 20 | | innodb_stats_transient_sample_pages | 8 | | large_page_size | 0 | | large_pages | OFF | +--------------------------------------+-----------+ 10 rows in set
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
頁里面記錄的是行信息,數據在innodb里是按照行來存儲的。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。