暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

MySQL CREATE 语句附加功能

原创 CuiHulong 2024-12-04
599

在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;

image.png
作用:配置更大的扩展大小可以帮助避免碎片化,并促进大量数据的摄入。

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

image.png

作用:CREATE TABLE。。。SELECT 保证一致。

总结

通过MySQL在创建数据库对象时提供的一些附加功能和选项的示例。可以大大提高数据库的灵活性,不同场景合理使用。

参考

https://dev.mysql.com/doc/refman/8.4/en/create-table.html

最后修改时间:2024-12-05 10:04:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论