PolarDB历史库使用X-Engine代替了InnoDB作为默认存储引擎,具有较高的数据压缩率,非常适合对计算诉求不高但需要存储一些归档类数据(如钉钉消息等数据)的业务。本文介绍PolarDB历史库相关的使用说明。
前提条件
仅PolarDB MySQL8.0版本支持历史库产品系列。更多详情,请参见PolarDB历史库。
创建PolarDB历史库(X-Engine)
PolarDB历史库的创建方式与PolarDB集群创建方式一致,您只需在售卖页选择兼容性为MySQL 8.0,且系列为历史库(高压缩率)即可。其他参数说明,请参见创建PolarDB MySQL数据库集群。

在历史库中创建表
在PolarDB历史库上创建表的方式与在使用InnoDB引擎的数据库上创建方式一致。由于历史库默认引擎为X-Engine,若建表时未指定引擎,默认会创建X-Engine引擎的表。例如,使用如下命令创建一张表(未指定引擎):
CREATE TABLE test_arc.t1 (id int PRIMARY KEY,c1 varchar(10));
使用show create table
命令查看建表语句详情,结果如下:

表创建成功后,后续使用方法与InnoDB一样,数据会存储在X-Engine引擎上。
- PolarDB历史库同时也支持创建InnoDB表,例如使用DTS迁移数据时,可能会出现迁移的表引擎仍然为InnoDB。若需要将其转换为X-Engine表,请参见InnoDB引擎转换为X-Engine引擎。
- 您可以通过如下命令查看当前数据库的默认引擎:
show variables like '%default_storage_engine%';
使用限制
- 与InnoDB引擎共存时的资源分配限制
使用X-Engine引擎时,由于95%的内存会提供给X-Engine引擎用做写入缓存和BlockCache以加速读写速度,留给InnoDB Buffer Pool的内存非常少,所以在X-Engine引擎的集群中,请尽量避免使用InnoDB引擎表存储太多数据,否则会因为缓存命中率低而导致性能大幅降低。建议使用PolarDB历史库时,所有的表都使用相同的X-Engine引擎,避免引擎混用影响集群性能。
- 引擎功能限制
X-Engine引擎在功能上有如下限制。
分类 功能 说明 SQL功能 外键 不支持 临时表 不支持 分区表(partition) 不支持(所有与partition相关的创建及增删改查操作均不支持) Generated Column 不支持 Handler API 不支持 列属性 最大列长度
(longblob/longtext/json)
32MB GIS地理数据类型 所有GIS相关数据类型均不支持(包含geometry、point、linestring、polygon、multipoint、multilinestring、multipolygon、gemometrycollection) 索引 哈希索引 不支持 空间索引 不支持(所有与全文索引相关的创建、使用均不支持) 事务 事务隔离级别 支持如下2个隔离级别: - 读已提交(RC)
- 可重复读(RR)
单个事务支持的最大数据量 32 MB Savepoint 不支持 XA事务 即将支持 锁 锁粒度 - 支持表级别锁和行级别锁
- 不支持GAP锁
Skip Locked 不支持 Lock Nowait 不支持 字符集 非索引列支持的字符集 非索引列支持所有的字符集(校对规则) 索引列支持的字符集 - latin1(latin1_bin)
- gbk(gbk_chinese_ci、gbk_bin)
- utf8(utf8_general_ci、utf8_bin)
- utf8mb4(utf8mb4_0900_ai_ci、utf8mb4_general_ci、utf8mb4_bin)
主从复制 Binlog格式 支持如下3种格式: - stmt
- row
- mixed
说明 默认为row,采用stmt/mixed在特定并发场景可能存在数据安全性问题。说明 对于X-Engine引擎中其他未列出的功能,默认其功能特性与InnoDB引擎相同。 - 大事务功能限制
X-Engine目前不支持大事务。当一个事务修改的行数等于或大于10000行时,X-Engine会启用
commit in middle
功能,即X-Engine会在内部提交该事务,并重新开启一个子事务继续执行该事务。但commit in middle
并不能遵循严格意义上的事务原子性(Atomicity),因此您在使用过程中需要注意如下几点:- 假设需要开启一个事务插入大量数据,但在数据插入过程中,由于
commit in middle
功能,已经先提交了一部分数据,其它请求就可以访问到插入的数据。 - 假设需要开启一个事务修改大量数据,已经执行了
commit in middle
的事务将无法回滚。drop table t1; create table t1(c1 int primary key , c2 int)ENGINE=xengine; begin; call insert_data(12000); //插入12000行数据,触发commit in middle,前10000行数据已经提交。 rollback;// 回滚只能把最后2000条数据回滚。 select count(*) from t1; // 这里仍然能够查询到10000条数据。 +----------+ | count(*) | +----------+ | 10000 | +----------+ 1 row in set (0.00 sec)
- 假设需要开启一个需要修改且删除大量数据的事务,由于
commit in middle
功能,DELETE操作读不到本事务中新插入的行,导致新插入的数据未被DELETE。drop table t1; create table t1(c1 int primary key , c2 int)ENGINE=xengine; call insert_data(10000); begin; insert into t1 values(10001,10001), (10002,10002); delete from t1 where c1 >= 0;// delete操作触发commit in middle,导致delete操作没有读到本事务插入的行。 commit; select * from t1; +-------+-------+ | c1 | c2 | +-------+-------+ | 10001 | 10001 | | 10002 | 10002 | +-------+-------+ 2 rows in set (0.00 sec)
- 假设需要开启一个事务插入大量数据,但在数据插入过程中,由于
参数说明
- 针对表中可修改的参数,您可以根据业务需要进行修改。具体操作步骤,请参见设置集群参数。
- 表中所有参数在PolarDB控制台上都已加上MySQL配置文件的兼容性前缀
loose_
。
类别 | 参数 | 说明 | 是否支持修改 | 参数修改后,是否需要重启集群生效 |
---|---|---|---|---|
性能 | xengine_batch_group_max_group_size | 事务流水线最大分组数。 | 否 | 不涉及 |
xengine_batch_group_max_leader_wait_time_us | 事务流水线的最大等待时间。 | 否 | 不涉及 | |
xengine_batch_group_slot_array_size | 事务流水线最大batch大小。 | 否 | 不涉及 | |
xengine_parallel_read_threads | 并行扫描并发数 | 是 | 否 | |
xengine_parallel_wal_recovery | 并行恢复 | 否 | 不涉及 | |
内存 | xengine_block_cache_size | 读block缓存的大小。 | 否 | 不涉及 |
xengine_row_cache_size | 行缓存的大小。 | 否 | 不涉及 | |
xengine_write_buffer_size | 单Memtable的最大大小。 | 否 | 不涉及 | |
xengine_block_size | 磁盘上数据block大小。 | 否 | 不涉及 | |
xengine_db_write_buffer_size | 所有subtable的Active Memtable的总大小限制。 | 否 | 不涉及 | |
xengine_db_total_write_buffer_size | 所有subtable的Active Memtable/Immutable memtable的总大小限制。 | 否 | 不涉及 | |
xengine_scan_add_blocks_limit | 每个请求在范围扫描时,可以加到BlockCache中的Block数目。 | 是 | 否 | |
compaction | xengine_flush_delete_percent_trigger | 当Memtable中记录数超过此数目时,则xengine_flush_delete_record_trigger参数生效。 | 否 | 不涉及 |
锁 | xengine_max_row_locks | 单SQL请求中,最大可以锁定的行数。 | 否 | 不涉及 |
xengine_lock_wait_timeout | 锁等待超时时间。 | 是 | 否 |