MySQL中的表-區
MySQL中的區
無論何種情況,區的大小總是1M,但是剛建表表分配的比較少。
1.建立一個資料庫
mysql> create database vastdata;
Query OK, 1 row affected (0.01 sec)
2.使用這個資料庫
mysql> use vastdata
Database changed
3.建立一張表
mysql> create table t1 (col1 int not null auto_increment,col2 varchar(7000),primary key(col1))engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)
4.插入兩條資料 其中repeat('a',7000)為將a連續7000次,也就是7000個a。所以我們將一條記錄視為7K大小。
在MySQL中一個資料頁的大小是16KB,所以兩條記錄就會佔用一個頁
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
5.檢視t1表所對應的資料檔案大小
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 96K Oct 17 01:09 /data/mydb/vastdata/t1.ibd
6.使用py_innodb_page_info.py工具檢視資料檔案中頁的分佈
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type #系統的頁
page offset 00000001, page type #系統的頁
page offset 00000002, page type #系統的頁
page offset 00000003, page type , page level <0000> #存放資料的頁
page offset 00000000, page type #空閒頁
page offset 00000000, page type #空閒頁
Total number of page: 6: #分配的頁數
Freshly Allocated Page: 2 #空閒的頁數
Insert Buffer Bitmap: 1 #系統中Insert Buffer Bitmap對應的頁數
File Space Header: 1 #系統中File Space Header對應的頁數
B-tree Node: 1 #存放資料的頁數
File Segment inode: 1 系統中File Segment inode對應的頁數
7.檢視當前t1對應的資料檔案大小
-rw-rw---- 1 mysql mysql 96K Oct 17 01:09 /data/mydb/vastdata/t1.ibd
這裡會發現,t1表大小隻有96K,沒有直接分配1M。
8.再次插入一行記錄,大小約為7KB
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
9.再次檢視資料檔案大小,依然為96K
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 96K Oct 17 01:15 /data/mydb/vastdata/t1.ibd
10.檢視一下當前此資料檔案的內部頁分佈
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type
page offset 00000001, page type
page offset 00000002, page type
page offset 00000003, page type , page level <0001>
page offset 00000004, page type , page level <0000>
page offset 00000005, page type , page level <0000>
Total number of page: 6:
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 3
File Segment inode: 1
我們可以的看到,空閒頁沒有了。其中00000004,00000005為存放資料塊 00000003為根所對應的塊。
![MySQL中的表-區](https://i.iter01.com/images/197d62b15727ed4affbfc05bd7ee91935099522db245326e22d6a5bfc4dcf0cd.png)
11.建立一個儲存過程,目的是簡化插入。
15.檢視資料檔案中頁的分佈,驗證一下猜想
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0001>
page offset 00000004, page type <B-tree Node>, page level <0000>
page offset 00000005, page type <B-tree Node>, page level <0000>
page offset 00000006, page type <B-tree Node>, page level <0000>
page offset 00000007, page type <B-tree Node>, page level <0000>
page offset 00000008, page type <B-tree Node>, page level <0000>
page offset 00000009, page type <B-tree Node>, page level <0000>
page offset 0000000a, page type <B-tree Node>, page level <0000>
page offset 0000000b, page type <B-tree Node>, page level <0000>
page offset 0000000c, page type <B-tree Node>, page level <0000>
page offset 0000000d, page type <B-tree Node>, page level <0000>
page offset 0000000e, page type <B-tree Node>, page level <0000>
page offset 0000000f, page type <B-tree Node>, page level <0000>
page offset 00000010, page type <B-tree Node>, page level <0000>
page offset 00000011, page type <B-tree Node>, page level <0000>
page offset 00000012, page type <B-tree Node>, page level <0000>
page offset 00000013, page type <B-tree Node>, page level <0000>
page offset 00000014, page type <B-tree Node>, page level <0000>
page offset 00000015, page type <B-tree Node>, page level <0000>
page offset 00000016, page type <B-tree Node>, page level <0000>
page offset 00000017, page type <B-tree Node>, page level <0000>
page offset 00000018, page type <B-tree Node>, page level <0000>
page offset 00000019, page type <B-tree Node>, page level <0000>
page offset 0000001a, page type <B-tree Node>, page level <0000>
page offset 0000001b, page type <B-tree Node>, page level <0000>
page offset 0000001c, page type <B-tree Node>, page level <0000>
page offset 0000001d, page type <B-tree Node>, page level <0000>
page offset 0000001e, page type <B-tree Node>, page level <0000>
page offset 0000001f, page type <B-tree Node>, page level <0000>
page offset 00000020, page type <B-tree Node>, page level <0000>
page offset 00000021, page type <B-tree Node>, page level <0000>
page offset 00000022, page type <B-tree Node>, page level <0000>
page offset 00000023, page type <B-tree Node>, page level <0000>
Total number of page: 36:
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 33
File Segment inode: 1
這裡看到存放資料的資料頁為33個,其中一個為根。32+1=33
16.在插入一行記錄
[root@vast python]# python py_innodb_page_info.py /data/mydb/vastdata/t1.ibd
Total number of page: 128:
Freshly Allocated Page: 91
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 34
File Segment inode: 1
可見這時,剩餘91個空閒頁。
結論: 建立表的預設大小是96K。 innodb會先用32個頁大小的碎片頁(fragment page)來存放資料。 碎片頁耗盡後,才連續申請64個連續頁。64*16KB=1024KB=1M
目的:對於一些小表,或者是undo這類的段,可以在開始時申請較少的空間,節省磁碟容量的開銷。
無論何種情況,區的大小總是1M,但是剛建表表分配的比較少。
1.建立一個資料庫
mysql> create database vastdata;
Query OK, 1 row affected (0.01 sec)
2.使用這個資料庫
mysql> use vastdata
Database changed
3.建立一張表
mysql> create table t1 (col1 int not null auto_increment,col2 varchar(7000),primary key(col1))engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)
4.插入兩條資料 其中repeat('a',7000)為將a連續7000次,也就是7000個a。所以我們將一條記錄視為7K大小。
在MySQL中一個資料頁的大小是16KB,所以兩條記錄就會佔用一個頁
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
5.檢視t1表所對應的資料檔案大小
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 96K Oct 17 01:09 /data/mydb/vastdata/t1.ibd
6.使用py_innodb_page_info.py工具檢視資料檔案中頁的分佈
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type #系統的頁
page offset 00000001, page type #系統的頁
page offset 00000002, page type #系統的頁
page offset 00000003, page type , page level <0000> #存放資料的頁
page offset 00000000, page type #空閒頁
page offset 00000000, page type #空閒頁
Total number of page: 6: #分配的頁數
Freshly Allocated Page: 2 #空閒的頁數
Insert Buffer Bitmap: 1 #系統中Insert Buffer Bitmap對應的頁數
File Space Header: 1 #系統中File Space Header對應的頁數
B-tree Node: 1 #存放資料的頁數
File Segment inode: 1 系統中File Segment inode對應的頁數
7.檢視當前t1對應的資料檔案大小
-rw-rw---- 1 mysql mysql 96K Oct 17 01:09 /data/mydb/vastdata/t1.ibd
這裡會發現,t1表大小隻有96K,沒有直接分配1M。
8.再次插入一行記錄,大小約為7KB
mysql> insert t1 select null,repeat('a',7000);
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
9.再次檢視資料檔案大小,依然為96K
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 96K Oct 17 01:15 /data/mydb/vastdata/t1.ibd
10.檢視一下當前此資料檔案的內部頁分佈
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type
page offset 00000001, page type
page offset 00000002, page type
page offset 00000003, page type , page level <0001>
page offset 00000004, page type , page level <0000>
page offset 00000005, page type , page level <0000>
Total number of page: 6:
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 3
File Segment inode: 1
我們可以的看到,空閒頁沒有了。其中00000004,00000005為存放資料塊 00000003為根所對應的塊。
![MySQL中的表-區](https://i.iter01.com/images/197d62b15727ed4affbfc05bd7ee91935099522db245326e22d6a5bfc4dcf0cd.png)
11.建立一個儲存過程,目的是簡化插入。
mysql> delimiter //
mysql> create procedure load_t1(count INT UNSIGNED)
-> begin
-> declare s int unsigned default 1;
-> declare c varchar(7000) default repeat('a',7000);
-> while s <= count DO
-> insert into t1 select NULL,c;
-> set s = s+1;
-> end while;
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> create procedure load_t1(count INT UNSIGNED)
-> begin
-> declare s int unsigned default 1;
-> declare c varchar(7000) default repeat('a',7000);
-> while s <= count DO
-> insert into t1 select NULL,c;
-> set s = s+1;
-> end while;
-> end;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
12.執行這個儲存過程,60則表示在表中插入60行,每行都是7000個a
12.執行這個儲存過程,60則表示在表中插入60行,每行都是7000個a
mysql> call load_t1(60);
Query OK, 1 row affected (0.06 sec)
13.檢視錶有多少行記錄,可見為63行
Query OK, 1 row affected (0.06 sec)
13.檢視錶有多少行記錄,可見為63行
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 63 |
+----------+
1 row in set (0.00 sec)
14.檢視資料檔案大小
+----------+
| count(*) |
+----------+
| 63 |
+----------+
1 row in set (0.00 sec)
14.檢視資料檔案大小
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 576K Oct 17 01:39 /data/mydb/vastdata/t1.ibd
63 * 7KB = 441KB 兩行記錄需要一個資料頁,故這63行需要32個資料頁-rw-rw---- 1 mysql mysql 576K Oct 17 01:39 /data/mydb/vastdata/t1.ibd
15.檢視資料檔案中頁的分佈,驗證一下猜想
[root@vast python]# python py_innodb_page_info.py -v /data/mydb/vastdata/t1.ibd
page offset 00000000, page type <File Space Header>
page offset 00000001, page type <Insert Buffer Bitmap>
page offset 00000002, page type <File Segment inode>
page offset 00000003, page type <B-tree Node>, page level <0001>
page offset 00000004, page type <B-tree Node>, page level <0000>
page offset 00000005, page type <B-tree Node>, page level <0000>
page offset 00000006, page type <B-tree Node>, page level <0000>
page offset 00000007, page type <B-tree Node>, page level <0000>
page offset 00000008, page type <B-tree Node>, page level <0000>
page offset 00000009, page type <B-tree Node>, page level <0000>
page offset 0000000a, page type <B-tree Node>, page level <0000>
page offset 0000000b, page type <B-tree Node>, page level <0000>
page offset 0000000c, page type <B-tree Node>, page level <0000>
page offset 0000000d, page type <B-tree Node>, page level <0000>
page offset 0000000e, page type <B-tree Node>, page level <0000>
page offset 0000000f, page type <B-tree Node>, page level <0000>
page offset 00000010, page type <B-tree Node>, page level <0000>
page offset 00000011, page type <B-tree Node>, page level <0000>
page offset 00000012, page type <B-tree Node>, page level <0000>
page offset 00000013, page type <B-tree Node>, page level <0000>
page offset 00000014, page type <B-tree Node>, page level <0000>
page offset 00000015, page type <B-tree Node>, page level <0000>
page offset 00000016, page type <B-tree Node>, page level <0000>
page offset 00000017, page type <B-tree Node>, page level <0000>
page offset 00000018, page type <B-tree Node>, page level <0000>
page offset 00000019, page type <B-tree Node>, page level <0000>
page offset 0000001a, page type <B-tree Node>, page level <0000>
page offset 0000001b, page type <B-tree Node>, page level <0000>
page offset 0000001c, page type <B-tree Node>, page level <0000>
page offset 0000001d, page type <B-tree Node>, page level <0000>
page offset 0000001e, page type <B-tree Node>, page level <0000>
page offset 0000001f, page type <B-tree Node>, page level <0000>
page offset 00000020, page type <B-tree Node>, page level <0000>
page offset 00000021, page type <B-tree Node>, page level <0000>
page offset 00000022, page type <B-tree Node>, page level <0000>
page offset 00000023, page type <B-tree Node>, page level <0000>
Total number of page: 36:
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 33
File Segment inode: 1
這裡看到存放資料的資料頁為33個,其中一個為根。32+1=33
16.在插入一行記錄
mysql> call load_t1(1);
Query OK, 1 row affected (0.01 sec)
17.檢視資料檔案大小,發現這時,資料檔案為2M
Query OK, 1 row affected (0.01 sec)
17.檢視資料檔案大小,發現這時,資料檔案為2M
mysql> system ls -lh /data/mydb/vastdata/t1.ibd
-rw-rw---- 1 mysql mysql 2.0M Oct 17 01:50 /data/mydb/vastdata/t1.ibd
mysql>
18.檢視資料檔案中頁的分佈。-rw-rw---- 1 mysql mysql 2.0M Oct 17 01:50 /data/mydb/vastdata/t1.ibd
mysql>
[root@vast python]# python py_innodb_page_info.py /data/mydb/vastdata/t1.ibd
Total number of page: 128:
Freshly Allocated Page: 91
Insert Buffer Bitmap: 1
File Space Header: 1
B-tree Node: 34
File Segment inode: 1
可見這時,剩餘91個空閒頁。
結論: 建立表的預設大小是96K。 innodb會先用32個頁大小的碎片頁(fragment page)來存放資料。 碎片頁耗盡後,才連續申請64個連續頁。64*16KB=1024KB=1M
目的:對於一些小表,或者是undo這類的段,可以在開始時申請較少的空間,節省磁碟容量的開銷。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30820196/viewspace-2126556/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 中的臨時表MySql
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- mysql 快清表中的資料MySql
- docker中的MySQL修改時區DockerMySql
- MySQL中的時區設定MySql
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- MySQL中datetime和timestamp的區別MySql
- MySQL中複製資料表中的資料到新表中的操作教程MySql
- mysql 兩個表結果合拼到一個表,用常量區別不同的表MySql
- MySQL表名不區分大小寫的設定方法MySql
- Mysql中的鎖機制——MyISAM表鎖MySql
- mysql怎麼清空表中的資料MySql
- 在MySQL中 Truncate Delect Drop 的區別MySql
- MySQL中REPLACE INTO和INSERT INTO的區別分析MySql
- 【Mysql】MySQL中interactive_timeout和wait_timeout的區別MySqlAI
- MySQL時區導致無法產生表MySql
- mysql 刪除表中重複的資料MySql
- Mysql中S 鎖和 X 鎖的區別MySql
- MySQL中CHAR和VARCHAR區別MySql
- mysql複製中臨時表的運用技巧MySql
- mysql中複製表結構的方法小結MySql
- mysql 從一個表中查詢,插入到另一個表中MySql
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- 淺談mysql中各種表空間(tablespaces)的概念MySql
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- MySQL中的全表掃描和索引樹掃描MySql索引
- 隨筆:MySQL中'' ' ' NULL在Innodb儲存的區別MySqlNull
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- MySQL修改表的列名MySql
- MySQL中讀頁緩衝區buffer poolMySql
- android 中心區域選中圖表 WheelChartAndroid
- my.cnf中[mysql]與[mysqld]下引數的區別MySql
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- Mysql中tinyint(1)和tinyint(4)的區別詳析WIFRMySql
- MySQL 當中定位鎖爭用比較嚴重的表(中級篇)MySql
- button 和input 的區別及在表單form中的用法ORM
- 【Mysql】修改mysql時區MySql
- 【MySQL】MySQL中的鎖MySql