在MySQL中,CREATE 语句主要用于创建数据库对象(如数据库、表、索引、视图等)的结构。然而,在MySQL官方文档中, 提供了一些附加功能和选项,可以在创建这些对象时进一步提高其灵活性和功能。
下面抽取对InnoDB引擎有效,同时生产环境中可以实际使用补助选项进行介绍
CREATE语句的附加option如下:
CREATE TABLE
。。。
table_option: {
AUTOEXTEND_SIZE [=] value
| COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
| CONNECTION [=] 'connect_string'
| {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
| ENGINE_ATTRIBUTE [=] 'string'
| START TRANSACTION
| STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
| STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
| STATS_SAMPLE_PAGES [=] value
。。。
}
具体介绍这些Option的使用方法和作用。
AUTOEXTEND_SIZE
通过指定AUTOEXTEND_SIZE选项,可以配置每个表或通用表空间的文件扩展量。
#表
CREATE TABLE t1 (c1 INT) AUTOEXTEND_SIZE = 4M;
#表空间
CREATE TABLESPACE ts1 AUTOEXTEND_SIZE = 4M;

作用:配置更大的扩展大小可以帮助避免碎片化,并促进大量数据的摄入。
STATS_PERSISTENT
指定是否为InnoDB表启用持久统计信息。值1启用表的持久统计信息,而值0关闭此功能。发出ANALYZE TABLE语句以计算统计数据,在将统计数据加载到系统表中。跟全局参数innodb_stats_persistent同等效果。
CREATE TABLE `t1` (
`id` bigint auto_increment,
`Name` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB, STATS_PERSISTENT=1;
作用:对于某些特殊表,可以选择性进行持久化。
STATS_AUTO_RECALC
InnoDB表的持久统计信息。当表中10%的数据发生变化时,值1会导致重新计算统计数据。值0阻止此表的自动重新计算;使用此设置,在生成大量数据后,发出ANALYZE TABLE语句以重新计算统计数据。跟全局参数innodb_stats_auto_recalc同等效果。
CREATE TABLE `t1` (
`id` bigint auto_increment,
`Name` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB, STATS_AUTO_RECALC=1;
作用:对于某些特殊表,可以选择性进行持久化。
STATS_SAMPLE_PAGES
在估计索引列的基数和其他统计信息(如ANALYZE TABLE计算的统计信息)时要采样的索引页数。
mysql> show variables like '%innodb_stats_persistent_sample_pages%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| innodb_stats_persistent_sample_pages | 20 |
+--------------------------------------+-------+
1 row in set (0.00 sec)
作用:对于某些特殊表,为了获得更准确的评估值,可以采取更多的页。
CONNECTION
FEDERATED表的连接字符串,MySQL的链接服务器LinkedServer。
mysql> CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) ,
KEY `name` (`name`)
) ENGINE=FEDERATED CONNECTION='mysql://root:123456@127.0.0.1:3410/db1/t1'
作用:实现简单的Link服务功能。
{DATA | INDEX} DIRECTORY
允许在数据目录之外创建表,必须启用innodb_file_per_table变量才能使用DATA DIRECTORY子句。必须指定完整目录路径
CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
作用:指定除DATA目录外的路径。
COMPRESSION
用于InnoDB表的页面级压缩的压缩算法。支持的值包括Zlib、LZ4和None。COMPRESSION属性是通过透明页面压缩功能引入的。页面压缩仅支持驻留在每个表的文件表空间中的InnoDB表,并且仅在支持稀疏文件和打孔的Linux和Windows平台上可用。
CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
作用:更少的空间占比,但CPU负载会有提升。
ENGINE_ATTRIBUTE
用于指定主存储引擎和辅助存储引擎的表属性。这些选项保留供将来使用。
CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='ENGINE_ATTRIBUTE=ROW_FORMAT=COMPRESSED' ;
作用:将来~
START TRANSACTION
CREATE TABLE作为事务进行提交,之后需要执行COMMIT和ROLLBACK语句。同时允许CREATE。。。SELECT作为一个原子操作,记录binlog内容。
mysql> CREATE TABLE `t2` ( `id` int DEFAULT NULL ) ENGINE=InnoDB START TRANSACTION;
Query OK, 0 rows affected (0.03 sec)
#提示COMMIT 或 ROLLBACK
mysql> SHOW TABLES;
ERROR 3977 (HY000): Only BINLOG INSERT, COMMIT and ROLLBACK statements are allowed after CREATE TABLE with START TRANSACTION statement.
mysql> COMMIT;
CREATE TABLE。。。SELECT 语句。原子DDL语句:
#5.7.44 版本执行失败
mysql> CREATE TABLE `t2` ( `id` int DEFAULT NULL ) ENGINE=InnoDB SELECT id FROM T1;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
#8.0.40版本执行成功
mysql > CREATE TABLE `t2` ( `id` int DEFAULT NULL ) ENGINE=InnoDB SELECT id FROM T1;
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
8.0版本binlog文件解析
shell> mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000001

作用:CREATE TABLE。。。SELECT 保证一致。
总结
通过MySQL在创建数据库对象时提供的一些附加功能和选项的示例。可以大大提高数据库的灵活性,不同场景合理使用。
参考
https://dev.mysql.com/doc/refman/8.4/en/create-table.html




