本文将为您介绍如何使用高压缩引擎(X-Engine)。
将InnoDB引擎下的表转存至高压缩引擎(X-Engine)
您可以执行以下命令,将InnoDB引擎下的表转存至X-Engine引擎。
ALTER TABLE <数据库名>.<表名> ENGINE xengine;
使用ALTER
命令将InnoDB引擎下的表转存至X-Engine引擎的过程中,会阻塞转换涉及的表的写入操作(DML和DDL)。
在高压缩引擎(X-Engine)中创建表
在双引擎(InnoDB和X-Engine)集群中创建位于X-Engine引擎的表,您需要在创建表时指定X-Engine引擎。语法示例如下:
CREATE TABLE t1(c1 int primary key , c2 int) ENGINE=xengine;
调整内存资源占比
您可以在集群
页面的X-Engine高压缩引擎(温数据)页签中,根据实际业务场景随时调整内存资源比例。以下为您展示三种典型场景下的存储引擎内存资源占比配置,供您参考。您可根据实际业务场景进行配置。
适用场景 | InnoDB引擎内存资源占比(百分比) | X-Engine内存资源占比(百分比) |
使用InnoDB引擎存储热数据,X-Engine引擎存储冷数据,且归档后的冷数据基本不会被访问。 | 80 | 20 |
使用InnoDB引擎存储热数据,X-Engine引擎存储冷数据,且归档后的冷数据仍然会被更新或查询。 | 50 | 50 |
使用InnoDB引擎存储少量表,X-Engine引擎存储大量表,并且数据会被更新或查询。 | 20 | 80 |
使用限制
高压缩引擎(X-Engine)存在引擎以及大事物功能上存在相关限制。
引擎功能限制
分类 | 功能 | 说明 |
SQL功能 | 外键 | 不支持 |
临时表 | 不支持 | |
Generated Column | 不支持 | |
Handler API | 不支持 | |
列属性 | 最大列长度(longblob/longtext/json) | 32 MB |
GIS地理数据类型 | 不支持所有GIS相关数据类型(包含geometry、point、linestring、polygon、multipoint、multilinestring、multipolygon、geometrycollection) | |
索引 | 哈希索引 | 不支持 |
空间索引 | 不支持(所有与全文索引相关的创建、使用均不支持) | |
事务 | 事务隔离级别 | 支持如下2个隔离级别:
|
单个事务支持的最大数据量 | 32 MB | |
Savepoint | 不支持 | |
XA事务 | 支持内部XA事务 | |
锁 | 锁粒度 |
|
Skip Locked | 不支持 | |
Lock Nowait | 不支持 | |
字符集 | 非索引列支持的字符集 | 非索引列支持所有的字符集(校对规则) |
索引列支持的字符集 |
| |
主从复制 | Binlog格式 | 支持如下3种格式:
说明 默认为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_。如果您需要在PolarDB控制台修改参数,请选择带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 | 用于缓存其表的数据和索引的块缓存大小。 | 是 | 否 |
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的总记录数。当Memtable中的记录数达到预设值时,会触发Memtable的切换。 | 否 | 不涉及 |
锁 | xengine_max_row_locks | 单SQL请求中,最大可以锁定的行数。 | 否 | 不涉及 |
xengine_lock_wait_timeout | 锁等待超时时间。 | 是 | 否 |