5.7以及以前,需要在初始化时进行设置,但是8.0.14以后,可以在线进行设置调整。
添加UndoTablespaces
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';查看UndoTablespaces
mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
-> WHERE FILE_TYPE LIKE 'UNDO LOG';
+-----------------+------------+
| TABLESPACE_NAME | FILE_NAME |
+-----------------+------------+
| innodb_undo_001 | ./undo_001 |
| innodb_undo_002 | ./undo_002 |
+-----------------+------------+
2 rows in set (0.00 sec)删除UndoTablespaces
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
DROP UNDO TABLESPACE tablespace_name;undo的自动回收
mysql> SELECT @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 128 |
+----------------------------------------+
SET GLOBAL innodb_purge_rseg_truncate_frequency=32;关于此参数:innodb_purge_rseg_truncate_frequency网上说法众多,MySql手册的原文:
By default, the purgethread looks for undo tablespaces to truncate once every 128 times that purge is invoked.按照我的理解应该是:默认情况下,每128次purge被调用后,就进行一次查找并truncate的操作。
3.5、Temp Tablespaces
与Compact行格式很像,差异在于页面溢出的处理上;
4.5 COMPRESSED Row Format
在Dynamic的基础上使用了压缩算法;
4.6 Overflow Page(页溢出)
因为每页16KB,至少存储两行,所以每行大概有8KB的数据;抛开记录头信息等,大致每列超过768B就会产生页溢出;
Compact:
1、会将溢出的数据单独放入一个页;外加20B存储额外页的信息(plus the 20-byte pointer to the externally stored part)
2、索引可以使用前768B
Dynamic:
1、如果页溢出,则使用20B存储整个列信息(列数据都存储在溢出页上)(with the clustered index record containing only a 20-byte pointer to the overflow page)
2、可以使用前3072B字符的索引(--innodb-large-prefix决定)
建议: 5.7+ 版本Dynamic。大字段不要存储到MySQL,最好使用MongDB等相关数据库。
Tablespaces(表空间)
一个数据文件,可以保存一个或多个InnoDB表和相关索引的数据(原文为:A data file that can hold data for one or more InnoDB tables and associated indexes.)我认为这个描述不是很准确,有可能一个表空间中有多个数据文件的情况,而且还有使用裸设备的情况(虽然现在几乎没有人在MySql中使用裸设备)。