当您的业务需要在处理高并发在线事务(OLTP)的同时,对海量数据进行复杂的分析查询(OLAP)时,传统的行存数据库往往面临成本与性能的双重挑战。PolarDB-X的列存索引功能,旨在解决这一混合负载(HTAP)场景下的痛点。
功能简介
PolarDB-X的列存索引,本质上是构建在主表之上的一个二级索引。它采用列式存储格式,将数据高效压缩后持久化于低成本的对象存储(OSS)中。其核心特性包括:
低成本存储:通过采用列式压缩技术实现3至5倍的数据压缩,结合对象存储(OSS)的单价,显著降低了数据存储成本。
高性能查询:针对聚合计算(如
SUM
、COUNT
)、多条件过滤(如WHERE
子句)以及多维度分析(如GROUP BY
)场景,仅加载所需列数据,减少了I/O开销,查询速度较行式存储提升了5至10倍。灵活访问模式:主实例与只读实例均可直接访问列存索引,支持读写分离架构,以满足OLTP与OLAP混合负载的需求。
冷热分层存储:可结合生命周期管理策略,自动将冷数据迁移至列存,实现热数据(高频访问)与冷数据(低频访问)的动态隔离。
列式索引对应用程序完全透明,您无需修改任何业务代码,即可在同一套系统中无缝集成在线事务处理与高性能分析能力。目前广泛运用于电商SaaS平台、工业物联网(IoT)、能源和金融等场景。
数据归档
常见问题:业务系统中存在大量需要长期保存但访问频率低的历史数据(如订单、日志),这些数据存储在行存中不仅成本高昂,还会拖累主业务表的查询性能。
解决方案:通过为历史数据表创建列存索引并设置归档规则(TTL),系统可自动将满足条件的冷数据从行存迁移至低成本的列存。此操作不仅能释放宝贵的行存空间,还能提升主表的查询效率。
典型操作:
创建归档表,例如将超过三个月的数据自动归档。
-- 为 ttlTableName 表创建一个结构相同、使用列存引擎的归档表 CREATE TABLE archiveTableName LIKE ttlTableName ENGINE = 'Columnar' ARCHIVE_MODE = 'TTL';
直接查询归档数据。
-- 查询时仅加载 order_id 和 amount 两列,避免全表扫描 SELECT order_id, amount FROM archiveTableName WHERE ...;
核心收益:
降低成本:存储成本可降低80%以上。
提升性能:行存主表性能得到提升,同时冷数据的聚合分析查询(如
SUM
,COUNT
)也能获得良好性能。存储规模:支持PB级数据规格,适用于大数据量的归档需求。
风控与审计(秒级快照)
常见问题:在风控、审计等场景下,需要对任意历史时间点的数据进行快照查询与分析,以实现行为追溯或问题定位。传统数据库难以实现高频、低延迟的快照生成。
解决方案:为核心数据表创建列存索引后,可以利用其秒级快照能力,快速固化任意时刻的数据状态。主实例与只读实例均可访问这些快照,进行无干扰的回溯分析。
典型操作:
为风控数据表创建列存索引。
CREATE CLUSTERED COLUMNAR INDEX <cci_name> ON <table_name> (<column_name1>, <column_name2>) xxx;
手动触发一次快照生成。
CALL polardbx.columnar_flush();
说明手动触发后将生成一个快照点,并返回一个
unsigned long
类型的值,即TSO值。该值代表该快照点的版本(一个与时区无关的时间戳),例如7363155090451988544
。您也可通过
CALL polardbx.columnar_config()
命令让系统定期生成快照点。
基于时间戳(TSO)查询指定的历史快照数据。
-- TSO 是一个精确到秒的时间点标识 SELECT * FROM <table_name> AS OF TSO <TSO> FORCE INDEX(<cci_name>);
说明<TSO>
为上述手动出发的快照生成点。您可以通过SELECT * FROM INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS;
命令查询来获取当前可用的快照点(包括手动生成和自动生成的快照点)。<cci_name>
为上述创建的列存索引名称。
核心收益:
实时性强:快照生成延迟低于1秒,满足实时风控需求。
数据可回溯:支持查询任意历史时间点的数据。
成本可控:数据以列式压缩存储在低成本的对象存储中。
大宽表分析
常见问题:对具有上百个字段的“大宽表”(如用户画像表)进行分析时,传统行存需要读取所有列的数据,即使查询只涉及其中几列,也会导致巨大的I/O开销和缓慢的查询响应。
解决方案:列存索引按列存储数据。当执行分析查询时,系统仅加载查询涉及的列,极大减少了I/O量。配合列存只读实例的MPP(大规模并行处理)能力,可进一步加速聚合运算。
典型操作:
-- 该查询仅需读取 category, price, stock 三列的数据 SELECT category, AVG(price) FROM product_info WHERE stock > 0 GROUP BY category;
核心收益:
性能提升:聚合查询性能可提升10倍以上。
I/O降低:按需读取数据列,减少无效I/O。
逻辑简化:可有效减少因性能问题而引入的复杂JOIN操作。
大数据下的多维组合查询
常见问题:面对包含多个筛选条件(
WHERE
子句中的多个AND
)的复杂查询,传统行存数据库依赖B+树索引,但仅对高选择性的列有效。当查询条件组合灵活多变时,索引效率会急剧下降,易导致全表扫描。解决方案:列存索引天然适合多条件过滤场景。它无需为各种查询组合创建大量复合索引,即可对多个列同时进行高效过滤。
典型操作:
-- 即使 id 和 type 列没有联合索引,列存也能高效处理多条件过滤 SELECT product_category, SUM(order_amount) FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2024-01-01' AND id = 3 AND type = 2 GROUP BY product_category;
核心收益:
免建复杂索引:无需为应对多变的查询模式而创建和维护大量索引。
查询性能稳定无损:列存索引会自动识别热点数据优先加载,并在多条件过滤场景下提供稳定、高效的查询性能。
数据ETL
常见问题:执行ETL(数据抽取、转换、加载)任务时,为避免影响在线业务,通常需要搭建独立的、昂贵的只读实例用于数据抽取,这增加了架构复杂度和成本。
解决方案:为需要ETL的表创建列存索引,并购买一个低成本的列存只读实例。ETL任务在列存只读实例上执行,直接从列存索引中高效抽取数据,完全不影响主实例的在线业务。
典型操作:
为源数据表创建列存索引。
购买列存只读实例。
在ETL程序中,连接列存只读实例地址,执行
SELECT
语句抽取数据,直接写入目标系统(如数据仓库、分析平台)。
核心收益:
成本显著降低:相比行存只读实例,列存只读实例成本更低。
业务隔离:ETL任务与在线业务物理隔离,互不影响。
提升ETL效率:可按需抽取指定列,减少网络传输和下游处理的数据量。