2.2 基于 InnoDB 引擎的以页为单位的压缩表这也是 MySQL 现在主推的方式。后期所有的压缩表如果没有特别说明,都指的是 InnoDB 的压缩表。
InnoDB 压缩表和 MyISAM 压缩表不同是针对页的压缩。InnoDB 不仅压缩了数据,也压缩了索引。InnoDB 页大小分别为 1K、2K、4K、8K、16K、32K、64K,默认为 16K,32K 和 64K 不支持压缩。
以上规律也就是说表压缩是针对默认 16K 大小的页的倍数递减,通过指定 key_block_size 来设置压缩表的页大小。比如 8K 的页,key_block_size=8,默认 row_format 为 compressed,或者把 row_format 设置为 compressed,即代表 key_block_size=8。
在默认单表空间下,建立一张表 t1,默认为 InnoDB 引擎,默认页大小为 8K。
模拟点数据
mysql> create table t1(id int primary key, r1 varchar(200),r2 text);
Query OK, 0 rows affected (0.07 sec)
此处模拟 1W 行记录,数据文件大小为 22M。省略过程
root@ytt-pc:/var/lib/mysql/3304/ytt# ls -sihl
总用量 22M
3539514 22M -rw-r----- 1 mysql mysql 21M 3月 30 22:26 t1.ibd
更改表行格式为 compressed
mysql> alter table t1 row_format=compressed;
Query OK, 0 rows affected (3.99 sec)
Records: 0 Duplicates: 0 Warnings: 0
数据文件大小为 10M。压缩率大约为 50%
root@ytt-pc:/var/lib/mysql/3304/ytt# ls -sihl
总用量 11M
3539513 11M -rw-r----- 1 mysql mysql 10M 3月 30 22:27 t1.ibd
单表空间的优点是可以管理多个基于不同页磁盘表。刚才表 t1 基于页大小为 8K,在当前数据库下可以并存页大小为 4K 的表 t2,指定 key_block_size=4mysql> create table t2(id int primary key, r1 varchar(200),r2 text) key_block_size=4;
Query OK, 0 rows affected (0.07 sec)
比如通用表空间 ytt_ts1 文件块大小为 4K,key_block_size 必须等于 4。也就是说只支持页大小和文件块大小一样的压缩表。mysql> create tablespace ytt_ts1 add datafile 'ytt_ts1.ibd' file_block_size=4K;
Query OK, 0 rows affected (0.05 sec)
mysql> create table t3 like t2;
Query OK, 0 rows affected (0.06 sec)
mysql> alter table t3 tablespace ytt_ts1;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
对于和表空间文件块大小不一致的表,则报错。表 t4 页面大小为 8K,和4K 不匹配。mysql> create table t4 like t2;
Query OK, 0 rows affected (0.05 sec)
mysql> alter table t4 key_block_size=8;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table t4 tablespace ytt_ts1;
ERROR 1478 (HY000): InnoDB: Tablespace `ytt_ts1` uses block size 4096 and cannot contain a table with physical page size 8192
mysql> drop table t4;
Query OK, 0 rows affected (0.05 sec)