本文汇总了与X-Engine引擎相关的常见问题。关于更多高压缩引擎X-Engine的使用问题和RDS X-Engine迁移至PolarDB X-Engine问题请进钉钉群咨询,群号:24490017825。
X-Engine引擎是什么,能解决什么问题?
X-Engine是阿里巴巴自研的基于LSM-tree架构的存储引擎,提供了强大的数据压缩能力,满足了归档数据库低存储成本的要求。通过LSM-Tree(Log-Structured Merge-Tree)层次化架构和Zstandard(ZSTD)压缩算法实现了更高的数据压缩率,相较于使用InnoDB作为存储引擎,最高可节省70%的存储空间。相关文档请参见高压缩引擎(X-Engine)。
X-Engine压缩效果怎样?
X-Engine引擎默认打开数据压缩功能。一般情况下,相对于InnoDB引擎,存储空间能压缩到1/3至1/10,具体压缩比例与数据特征有关。X-Engine引擎支持通过采样信息来估算压缩比,您可以结合外部信息(如数据导入前的数据大小)自行计算准确的压缩率。
假设需要查询的表在数据库test
中,表名为test1
,来查询表数据估算后的压缩比。SQL语句如下:
SELECT
TABLE_NAME,
SUBTABLE_NAME,
SUM(EXTENTS*APRROX_CMP_RATIO)/SUM(EXTENTS)
FROM
INFORMATION_SCHEMA.XENGINE_SUBTABLE
WHERE TABLE_NAME = 'test.test1' AND SUBTABLE_NAME = 'PRIMARY' AND LEVEL in (1, 2);
SQL语句中XENGINE_SUBTABLE
表的Schema信息如下表:
列名 | 说明 |
TABLE_NAME | 由数据库名称和表名拼接而成。如 |
SUBTABLE_NAME | 索引名称。 |
LEVEL | 逻辑层号。 |
EXTENTS | 逻辑层使用的extent数量。 |
NUM_ENTRIES | 当前逻辑层的数据量。 |
NUM_DELETES | 逻辑层删除的数据量。 |
APRROX_CMP_RATIO | 当前逻辑层采样近似压缩比。 |
SAMPLE_OUTDATED | 当前逻辑层的采样信息是否过期。 |
支持使用SQL语句查询压缩比的企业版集群版本需要满足以下条件之一:
PolarDB MySQL版8.0.1版本,且修订版本为8.0.1.1.40及以上。
PolarDB MySQL版8.0.2版本,且修订版本为8.0.2.2.22及以上。
X-Engine引擎中的表是基于LSM-Tree的索引组织表,表数据存储在主索引中。主索引LSM-Tree分为3层,大部分数据集中在第1层和第2层,其中第0层是从内存直接转储的数据,不进行数据压缩。因此,查询压缩率的SQL语句中使用
LEVEL in (1, 2)
来计算这两层压缩比的加权平均值,从而得到X-Engine中的表数据的压缩比。如果要查询某个二级索引上的数据的压缩比,需要在SQL语句中指定
SUBTABLE_NAME
索引名称。
批量导入数据到X-Engine表后为什么压缩率较低?
X-Engine采用后台异步压缩技术,是在不影响业务使用的情况下,逐渐重整并压缩数据以达到理想压缩率。重整和后台压缩操作一般在业务低峰期进行。因此,批量导入后,数据存储空间可能接近压缩前水平,一段时间后空间将逐步释放。
X-Engine引擎相比RocksDB引擎、TokuDB引擎如何?
X-Engine引擎压缩率与TokuDB、RocksDB引擎压缩率接近。目前TokuDB社区已经停滞发展,后续数据库服务的可持续性无法保证,之前阿里云上存量的TokuDB用户已全部转到X-Engine引擎。相对RocksDB引擎以及对应的myrocks产品,PolarDB高压缩引擎(X-Engine)的核心优势是提供了海量存储,弹性以及在线变更schema的能力。相关文档请参见X-Engine性价比优势。
购买PolarDB集群时,如何选择使用X-Engine引擎?
PolarDB MySQL版8.0版本支持X-Engine引擎,PolarDB高压缩引擎(X-Engine)的创建方式与PolarDB集群创建方式一致,您只需在售卖页选择兼容性为MySQL 8.0,且系列为高压缩引擎(X-Engine)即可。
已经使用的PolarDB集群,是否支持开启X-Engine引擎?
目前PolarDB的最新版本已经支持存量PolarDB集群开启X-Engine引擎功能。选择PolarDB集群,在左侧导航栏选择配置与管理->高压缩引擎即可。动态开启X-Engine引擎的功能需要PolarDB MySQL版8.0版本且内核小版本需为8.0.1.1.31及以上。
如何使用X-Engine引擎表?
对于新建表,直接指定engine=xengine即可;对于存量表,可以通过ALTER语句将表转换为X-Engine引擎。相关文档请参见InnoDB/TokuDB/Myrocks引擎转换为X-Engine引擎。
X-Engine是否有相关的客户案例?
X-Engine引擎已经支持了阿里巴巴集群和阿里云的大量用户,累计数据量达到PB级别,总体实例数目超过3000+。客户案例相关文档请参见X-Engine最佳实践。
X-Engine引擎功能是否收费?
购买使用X-Engine引擎与InnoDB引擎计费规则一致,不额外单独收费。具体来说,如果存放在InnoDB引擎的数据是100 GB,存放在X-Engine引擎时数据被压缩为30 GB,就按照30 GB的存储容量计费。
PolarDB(X-Engine)相对于RDS(X-Engine)优势是什么?
PolarDB(X-Engine)提供了海量的存储空间,彻底解决用户的容量焦虑,最大支持500 TB的存储空间,PolarDB(X-Engine)采用存算分离技术,弹性增/减只读节点,一份数据至多支持16个只读节点。PolarDB(X-Engine)采用分布式存储,数据库的高可用不再需要依赖Binlog复制,间接提高了写入性能。
PolarDB MySQL版5.6/5.7版本是否支持X-Engine引擎?
不支持。
X-Engine支持事务吗?
支持事务。
X-Engine支持OnlineDDL吗?
支持,执行DDL变更过程中,不会阻塞其它事务的更新。
X-Engine支持并行DDL吗?
支持。
X-Engine引擎支持行锁吗?
X-Engine引擎支持行粒度的并发控制,并支持死锁检测,与InnoDB引擎一致。
X-Engine引擎支持哪些隔离级别?
支持read-committed,repeatable-read隔离级别,默认的隔离级别是read-committed。
X-Engine引擎支持大事务吗?
不支持大事务。对于大事务,内部会自动按行拆分,当一个事务修改的行数等于或大于10000行时,X-Engine会启用commit in middle功能,即X-Engine会在内部提交该事务,并重新开启一个子事务继续执行该事务。
X-Engine支持分区表吗?
支持。集群版本需满足以下要求:
PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.34及以上。
PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.16及以上。
该功能目前处于灰度发布阶段,如果需要开启该功能,请前往配额中心,根据配额ID
polardb_mysql_xengine_partition
找到配额名称,在对应的操作列单击申请来申请开通该功能。如需了解更多关于创建X-Engine分区表的内容,请搜索钉钉群号加群进行咨询。钉钉群号:24490017825。
X-Engine支持列索引分析吗?
不支持。
X-Engine引擎有哪些功能限制?
X-Engine引擎是一个事务引擎,完全兼容MySQL协议,具备存储引擎常用功能,对于一些高级功能的支持还不完善,具体使用限制请参见X-Engine使用说明。
X-Engine支持不同存储介质冷热分离吗?
不支持。
X-Engine支持并行查询吗?
目前仅PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.34及以上的版本支持并行查询。
X-Engine引擎的性能怎样?
X-Engine引擎采用LSM-tree组织数据,写入友好,写入性能强,读能力相对较弱。X-Engine引擎默认对数据开启压缩,综合性能相对于InnoDB引擎略有下降,在标准Sysbench压测场景下,性能较InnoDB引擎下降10%-20%之间。详情请参见PolarDB MySQL版8.0.1版本高压缩引擎(X-Engine)与集群版性能对比。
如何查看X-Engine引擎中的表占用的存储空间容量?
使用集群主地址连接数据库集群,根据需要查询的库名和表名在XENGINE_SUBTABLE
表中查询该表对应的TABLE_SPACE_ID
,并通过查询到的TABLE_SPACE_ID
在INFORMATION_SCHEMA的XENGINE_TABLE_SPACE
表中查看该表已使用的extent数量,再根据extent数量计算出该表占用的存储空间容量。
单个extent占用的存储空间容量为2 MB。
假设要查询的表所在的数据库为test
,表名为test1
,则查询表占用的存储空间容量的SQL语句如下:
SELECT
SUM(TOTAL_EXTENT_COUNT)/512 AS SIZE_GB,
SUM(USED_EXTENT_COUNT)/512 AS USED_SIZE_GB,
SUM(FREE_EXTENT_COUNT)/512 AS FREE_SIZE_GB
FROM
INFORMATION_SCHEMA.XENGINE_TABLE_SPACE
WHERE TABLE_SPACE_ID IN (
SELECT TABLE_SPACE_ID
FROM
INFORMATION_SCHEMA.XENGINE_SUBTABLE
WHERE TABLE_NAME = 'test.test1');
其中,XENGINE_TABLE_SPACE
是以文件视角来统计存储空间容量。该表中与空间相关的列及其说明如下:
列名 | 说明 |
TABLE_SPACE_ID | 表空间的ID。 说明 您可以在 |
TOTAL_EXTENT_COUNT | 总extent数量。 |
USED_EXTENT_COUNT | 已使用的extent数量。 |
FREE_EXTENT_COUNT | 空闲extent数量。 |
XENGINE_SUBTABLE
是以LSM各个层的角度来统计存储空间容量。该表中的列及其说明如下:
列名 | 说明 |
TABLE_NAME | 数据库名和表名的拼接。如数据库名为 |
SUBTABLE_NAME | 索引名。 |
SUBTABLE_ID | 索引ID。 |
TABLE_SPACE_ID | 索引对应的table space ID。 |
LEVEL | 逻辑层号。 |
LAYER | 逻辑层中的物理层。 说明 level 0可能存在多个物理层,level1和level2只有一个物理层。 |
EXTENTS | 该层使用的extent数量。 |