适用场景

当您的业务需要在处理高并发在线事务(OLTP)的同时,对海量数据进行复杂的分析查询(OLAP)时,传统的行存数据库往往面临成本与性能的双重挑战。PolarDB-X的列存索引功能,旨在解决这一混合负载(HTAP)场景下的痛点。

功能简介

PolarDB-X的列存索引,本质上是构建在主表之上的一个二级索引。它采用列式存储格式,将数据高效压缩后持久化于低成本的对象存储(OSS)中。其核心特性包括:

  • 低成本存储:通过采用列式压缩技术实现35倍的数据压缩,结合对象存储(OSS)的单价,显著降低了数据存储成本。

  • 高性能查询:针对聚合计算(如SUMCOUNT)、多条件过滤(如WHERE子句)以及多维度分析(如GROUP BY)场景,仅加载所需列数据,减少了I/O开销,查询速度较行式存储提升了510倍。

  • 灵活访问模式:主实例与只读实例均可直接访问列存索引,支持读写分离架构,以满足OLTPOLAP混合负载的需求。

  • 冷热分层存储:可结合生命周期管理策略,自动将冷数据迁移至列存,实现热数据(高频访问)与冷数据(低频访问)的动态隔离。

列式索引对应用程序完全透明,您无需修改任何业务代码,即可在同一套系统中无缝集成在线事务处理与高性能分析能力。目前广泛运用于电商SaaS平台、工业物联网(IoT)、能源和金融等场景。

数据归档

  • 常见问题:业务系统中存在大量需要长期保存但访问频率低的历史数据(如订单、日志),这些数据存储在行存中不仅成本高昂,还会拖累主业务表的查询性能。

  • 解决方案:通过为历史数据表创建列存索引并设置归档规则(TTL),系统可自动将满足条件的冷数据从行存迁移至低成本的列存。此操作不仅能释放宝贵的行存空间,还能提升主表的查询效率。

  • 典型操作

    1. 创建归档表,例如将超过三个月的数据自动归档。

      -- 为 ttlTableName 表创建一个结构相同、使用列存引擎的归档表
      CREATE TABLE archiveTableName 
      LIKE ttlTableName
      ENGINE = 'Columnar' 
      ARCHIVE_MODE = 'TTL';
    2. 直接查询归档数据。

      -- 查询时仅加载 order_id 和 amount 两列,避免全表扫描
      SELECT order_id, amount FROM archiveTableName WHERE ...;
  • 核心收益

    • 降低成本:存储成本可降低80%以上。

    • 提升性能:行存主表性能得到提升,同时冷数据的聚合分析查询(如SUMCOUNT)也能获得良好性能。

    • 存储规模:支持PB级数据规格,适用于大数据量的归档需求。

风控与审计(秒级快照

  • 常见问题:在风控、审计等场景下,需要对任意历史时间点的数据进行快照查询与分析,以实现行为追溯或问题定位。传统数据库难以实现高频、低延迟的快照生成。

  • 解决方案:为核心数据表创建列存索引后,可以利用其秒级快照能力,快速固化任意时刻的数据状态。主实例与只读实例均可访问这些快照,进行无干扰的回溯分析。

  • 典型操作

    1. 为风控数据表创建列存索引。

      CREATE CLUSTERED COLUMNAR INDEX <cci_name> ON <table_name> (<column_name1>, <column_name2>) xxx;
    2. 手动触发一次快照生成。

      CALL polardbx.columnar_flush();
      说明
      • 手动触发后将生成一个快照点,并返回一个unsigned long类型的值,即TSO值。该值代表该快照点的版本(一个与时区无关的时间戳),例如7363155090451988544

      • 您也可通过CALL polardbx.columnar_config()命令让系统定期生成快照点。

    3. 基于时间戳(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任务在列存只读实例上执行,直接从列存索引中高效抽取数据,完全不影响主实例的在线业务。

  • 典型操作

    1. 为源数据表创建列存索引。

    2. 购买列存只读实例。

    3. ETL程序中,连接列存只读实例地址,执行SELECT语句抽取数据,直接写入目标系统(如数据仓库、分析平台)。

  • 核心收益

    • 成本显著降低:相比行存只读实例,列存只读实例成本更低。

    • 业务隔离:ETL任务与在线业务物理隔离,互不影响。

    • 提升ETL效率:可按需抽取指定列,减少网络传输和下游处理的数据量。

常见问题

上述使用列存索引的场景,均可以直接在主实例上查询吗?

上述场景均涉及列存索引的创建。关于列存索引的查询,通常是将数据传输至计算节点进行处理,这会对计算节点的资源造成较大占用。为避免对主实例上其他在线业务的影响,建议您购买低成本的列存只读实例。

购买了列存只读实例后,如何连接和使用?

购买列存只读实例后,您会获得一个独立的只读连接地址

  • 直接连接:建议将所有分析型SQL通过该地址提交,这是最直接的方式。

  • 智能路由:应用也可以只连接主实例地址,通过配置行列路由机制策略,PolarDB-X会自动将分析查询转发到列存只读实例执行。