倒排索引

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
所有文档
menu
没有找到结果,请重新输入

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
  • 文档中心
  • arrow
  • 数据仓库PALO
  • arrow
  • 开发指南
  • arrow
  • 数据表设计
  • arrow
  • 表索引
  • arrow
  • 倒排索引
本页目录
  • 索引原理
  • 使用场景
  • 管理索引
  • 建表时定义倒排索引
  • 已有表增加倒排索引
  • 已有表删除倒排索引
  • 查看倒排索引
  • 使用索引
  • 利用倒排索引加速查询
  • 通过 profile 分析索引加速效果
  • 用分词函数验证分词效果
  • 使用示例
  • 建表
  • 导入数据
  • 查询

倒排索引

更新时间:2025-08-21

索引原理

倒排索引,是信息检索领域常用的索引技术,将文本分成一个个词,构建 词 -> 文档编号 的索引,可以快速查找一个词在哪些文档出现。

从 2.0.0 版本开始,PALO 支持倒排索引,可以用来进行文本类型的全文检索、普通数值日期类型的等值范围查询,快速从海量数据中过滤出满足条件的行。

在 PALO 的倒排索引实现中,Table 的一行对应一个文档、一列对应文档中的一个字段,因此利用倒排索引可以根据关键词快速定位包含它的行,达到 WHERE 子句加速的目的。

与 PALO 中其他索引不同的是,在存储层倒排索引使用独立的文件,跟数据文件一一对应、但物理存储上文件相互独立。这样的好处是可以做到创建、删除索引不用重写数据文件,大幅降低处理开销。

使用场景

倒排索引的使用范围很广泛,可以加速等值、范围、全文检索(关键词匹配、短语系列匹配等)。一个表可以有多个倒排索引,查询时多个倒排索引的条件可以任意组合。

倒排索引的功能简要介绍如下:

  1. 加速字符串类型的全文检索
  • 支持关键词检索,包括同时匹配多个关键字 MATCH_ALL、匹配任意一个关键字 MATCH_ANY
  • 支持短语查询 MATCH_PHRASE

    • 支持指定词距 slop
    • 支持短语 + 前缀 MATCH_PHRASE_PREFIX
  • 支持分词正则查询 MATCH_REGEXP
  • 支持英文、中文以及 Unicode 多种分词
  1. 加速普通等值、范围查询,覆盖原来 BITMAP 索引的功能,代替 BITMAP 索引
  • 支持字符串、数值、日期时间类型的 =, !=, >, >=, <, <= 快速过滤
  • 支持字符串、数字、日期时间数组类型的 =, !=, >, >=, <, <=
  1. 支持完善的逻辑组合
  • 不仅支持 AND 条件加速,还支持 OR NOT 条件加速
  • 支持多个条件的任意 AND OR NOT 逻辑组合
  1. 灵活高效的索引管理
  • 支持在创建表上定义倒排索引
  • 支持在已有的表上增加倒排索引,而且支持增量构建倒排索引,无需重写表中的已有数据
  • 支持删除已有表上的倒排索引,无需重写表中的已有数据

提示:

倒排索引的使用有下面一些限制:

  1. 存在精度问题的浮点数类型 FLOAT 和 DOUBLE 不支持倒排索引,原因是浮点数精度不准确。解决方案是使用精度准确的定点数类型 DECIMAL,DECIMAL 支持倒排索引。
  2. 部分复杂数据类型还不支持倒排索引,包括:MAP、STRUCT、JSON、HLL、BITMAP、QUANTILE_STATE、AGG_STATE。其中 MAP、STRUCT 会逐步支持,JSON 类型可以换成 VARIANT 类型获得支持。其他几个类型因为其特殊用途暂不需要支持倒排索引。
  3. DUPLICATE 和 开启 Merge-on-Write 的 UNIQUE 表模型支持任意列建倒排索引。但是 AGGREGATE 和 未开启 Merge-on-Write 的 UNIQUE 模型仅支持 Key 列建倒排索引,非 Key 列不能建倒排索引,这是因为这两个模型需要读取所有数据后做合并,因此不能利用索引做提前过滤。

管理索引

建表时定义倒排索引

在建表语句中 COLUMN 的定义之后是索引定义:

SQL
1CREATE TABLE table_name
2(
3  column_name1 TYPE1,
4  column_name2 TYPE2,
5  column_name3 TYPE3,
6  INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'],
7  INDEX idx_name2(column_name2) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment']
8)
9table_properties;

语法说明如下:

  1. idxcolumn_name(column_name) 是必须的,column_name 是建索引的列名,必须是前面列定义中出现过的,idx_column_name 是索引名字,必须表级别唯一,建议命名规范:列名前面加前缀 idx
  2. USING INVERTED 是必须的,用于指定索引类型是倒排索引
  3. PROPERTIES 是可选的,用于指定倒排索引的额外属性,目前支持的属性如下:
parser 指定分词器

- 默认不指定代表不分词

- `english` 是英文分词,适合被索引列是英文的情况,用空格和标点符号分词,性能高

- `chinese` 是中文分词,适合被索引列主要是中文的情况,性能比 English 分词低

- `unicode` 是多语言混合类型分词,适用于中英文混合、多语言混合的情况。它能够对邮箱前缀和后缀、IP 地址以及字符数字混合进行分词,并且可以对中文按字符分词。

分词的效果可以通过 TOKENIZE SQL 函数进行验证,具体参考后续章节。

parser_mode

用于指定分词的模式,目前 parser = chinese 时支持如下几种模式:

- fine_grained:细粒度模式,倾向于分出比较短、较多的词,比如 '武汉市长江大桥' 会分成 '武汉', '武汉市', '市长', '长江', '长江大桥', '大桥' 6 个词

- coarse_grained:粗粒度模式,倾向于分出比较长、较少的词,,比如 '武汉市长江大桥' 会分成 '武汉市' '长江大桥' 2 个词

- 默认 coarse_grained

support_phrase

用于指定索引是否支持 MATCH_PHRASE 短语查询加速

- true 为支持,但是索引需要更多的存储空间

- false 为不支持,更省存储空间,可以用 MATCH_ALL 查询多个关键字

- 从 2.0.14, 2.1.5 和 3.0.1 版本开始,如果指定了 parser 则默认为 true,否则默认为 false

例如下面的例子指定中文分词,粗粒度模式,支持短语查询加速。

SQL
1   INDEX idx_name(column_name) USING INVERTED PROPERTIES("parser" = "chinese", "parser_mode" = "coarse_grained", "support_phrase" = "true")
char_filter

用于指定在分词前对文本进行预处理,通常用于影响分词行为

char_filter_type:指定使用不同功能的 char_filter(目前仅支持 char_replace)

char_replace 将 pattern 中每个 char 替换为一个 replacement 中的 char

- char_filter_pattern:需要被替换掉的字符数

- char_filter_replacement:替换后的字符数组,可以不用配置,默认为一个空格字符

例如下面的例子将点和下划线替换成空格,达到将点和下划线作为单词分隔符的目的,影响分词行为。

SQL
1   INDEX idx_name(column_name) USING INVERTED PROPERTIES("parser" = "unicode", "char_filter_type" = "char_replace", "char_filter_pattern" = "._", "char_filter_replacement" = " ")

`

ignore_above

用于指定不分词字符串索引(没有指定 parser)的长度限制

- 长度超过 ignore_above 设置的字符串不会被索引。对于字符串数组,ignore_above 将分别应用于每个数组元素,长度超过 ignore_above 的字符串元素将不被索引。

- 默认为 256,单位是字节

lower_case

是否将分词进行小写转换,从而在匹配的时候实现忽略大小写

- true: 转换小写

- false:不转换小写

- 从 2.0.7 和 2.1.2 版本开始默认为 true,自动转小写,之前的版本默认为 false

stopwords

指明使用的停用词表,会影响分词器的行为

默认的内置停用词表包含一些无意义的词:'is'、'the'、'a' 等。在写入或者查询时,分词器会忽略停用词表中的词。

- none: 使用空的停用词表

  1. COMMENT 是可选的,用于指定索引注释

已有表增加倒排索引

  1. ADD INDEX

支持CREATE INDEX 和 ALTER TABLE ADD INDEX 两种语法,参数跟建表时索引定义相同

SQL
1-- 语法 1
2CREATE INDEX idx_name ON table_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
3-- 语法 2
4ALTER TABLE table_name ADD INDEX idx_name(column_name) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment'];
  1. BUILD INDEX

CREATE / ADD INDEX 操作只是新增了索引定义,这个操作之后的新写入数据会生成倒排索引,而存量数据需要使用 BUILD INDEX 触发:

SQL
1-- 语法 1,默认给全表的所有分区 BUILD INDEX
2BUILD INDEX index_name ON table_name;
3-- 语法 2,可指定 Partition,可指定一个或多个
4BUILD INDEX index_name ON table_name PARTITIONS(partition_name1, partition_name2);

通过 SHOW BUILD INDEX 查看 BUILD INDEX 进度:

SQL
1SHOW BUILD INDEX [FROM db_name];
2-- 示例 1,查看所有的 BUILD INDEX 任务进展
3SHOW BUILD INDEX;
4-- 示例 2,查看指定 table 的 BUILD INDEX 任务进展
5SHOW BUILD INDEX where TableName = "table1";

通过 CANCEL BUILD INDEX 取消 BUILD INDEX:

SQL
1CANCEL BUILD INDEX ON table_name;
2CANCEL BUILD INDEX ON table_name (job_id1,jobid_2,...);

提示:

BUILD INDEX 会生成一个异步任务执行,在每个 BE 上有多个线程执行索引构建任务,通过 BE 参数 alter_index_worker_count 可以设置,默认值是 3。

2.0.12 和 2.1.4 之前的版本 BUILD INDEX 会一直重试直到成功,从这两个版本开始通过失败和超时机制避免一直重试。3.0 存算分离模式暂不支持此命令。

  1. 一个 tablet 的多数副本 BUILD INDEX 失败后,整个 BUILD INDEX 失败结束
  2. 时间超过 alter_table_timeout_second (),BUILD INDEX 超时结束
  3. 用户可以多次触发 BUILD INDEX,已经 BUILD 成功的索引不会重复 BUILD

已有表删除倒排索引

SQL
1-- 语法 1
2DROP INDEX idx_name ON table_name;
3-- 语法 2
4ALTER TABLE table_name DROP INDEX idx_name;

提示:

DROP INDEX 会删除索引定义,新写入数据不会再写索引,同时会生成一个异步任务执行索引删除操作,在每个 BE 上有多个线程执行索引删除任务,通过 BE 参数 alter_index_worker_count 可以设置,默认值是 3。

查看倒排索引

SQL
1-- 语法 1,表的 schema 中 INDEX 部分 USING INVERTED 是倒排索引
2SHOW CREATE TABLE table_name;
3
4-- 语法 2,IndexType 为 INVERTED 的是倒排索引
5SHOW INDEX FROM idx_name;

使用索引

利用倒排索引加速查询

SQL
1-- 1. 全文检索关键词匹配,通过 MATCH_ANY MATCH_ALL 完成
2SELECT * FROM table_name WHERE column_name MATCH_ANY | MATCH_ALL 'keyword1 ...';
3
4-- 1.1 content 列中包含 keyword1 的行
5SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1';
6
7-- 1.2 content 列中包含 keyword1 或者 keyword2 的行,后面还可以添加多个 keyword
8SELECT * FROM table_name WHERE content MATCH_ANY 'keyword1 keyword2';
9
10-- 1.3 content 列中同时包含 keyword1 和 keyword2 的行,后面还可以添加多个 keyword
11SELECT * FROM table_name WHERE content MATCH_ALL 'keyword1 keyword2';
12
13
14-- 2. 全文检索短语匹配,通过 MATCH_PHRASE 完成
15-- 2.1 content 列中同时包含 keyword1 和 keyword2 的行,而且 keyword2 必须紧跟在 keyword1 后面
16-- 'keyword1 keyword2','wordx keyword1 keyword2','wordx keyword1 keyword2 wordy' 能匹配,因为他们都包含 keyword1 keyword2,而且 keyword2 紧跟在 keyword1 后面
17-- 'keyword1 wordx keyword2' 不能匹配,因为 keyword1 keyword2 之间隔了一个词 wordx
18-- 'keyword2 keyword1',因为 keyword1 keyword2 的顺序反了
19-- 使用 MATCH_PHRASE 需要再 PROPERTIES 中开启 "support_phrase" = "true"
20SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';
21
22-- 2.2 content 列中同时包含 keyword1 和 keyword2 的行,而且 keyword1 keyword2 的 `词距`(slop)不超过 3
23-- 'keyword1 keyword2', 'keyword1 a keyword2', 'keyword1 a b c keyword2' 都能匹配,因为 keyword1 keyword2 中间隔的词分别是 0 1 3 都不超过 3
24-- 'keyword1 a b c d keyword2' 不能能匹配,因为 keyword1 keyword2 中间隔的词有 4 个,超过 3
25-- 'keyword2 keyword1', 'keyword2 a keyword1', 'keyword2 a b c keyword1' 也能匹配,因为指定 slop > 0 时不再要求 keyword1 keyword2 的顺序。这个行为参考了 ES,与直觉的预期不一样,因此 PALO 提供了在 slop 后面指定正数符号(+)表示需要保持 keyword1 keyword2 的先后顺序
26SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3';
27-- slop 指定正号,'keyword1 a b c keyword2' 能匹配,而 'keyword2 a b c keyword1' 不能匹配
28SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2 ~3+';
29
30-- 2.3 在保持词顺序的前提下,对最后一个词 keyword2 做前缀匹配,默认找 50 个前缀词(session 变量 inverted_index_max_expansions 控制)
31-- 需要保证 keyword1, keyword2 在原文分词后也是相邻的,不能中间有其他词
32-- 'keyword1 keyword2abc' 能匹配,因为 keyword1 完全一样,最后一个 keyword2abc 是 keyword2 的前缀
33-- 'keyword1 keyword2' 也能匹配,因为 keyword2 也是 keyword2 的前缀
34-- 'keyword1 keyword3' 不能匹配,因为 keyword3 不是 keyword2 的前缀
35-- 'keyword1 keyword3abc' 也不能匹配,因为 keyword3abc 也不是 keyword2 的前缀
36SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1 keyword2';
37
38-- 2.4 如果只填一个词会退化为前缀查询,默认找 50 个前缀词(session 变量 inverted_index_max_expansions 控制)
39SELECT * FROM table_name WHERE content MATCH_PHRASE_PREFIX 'keyword1';
40
41-- 2.5 对分词后的词进行正则匹配,默认匹配 50 个(session 变量 inverted_index_max_expansions 控制)
42-- 类似 MATCH_PHRASE_PREFIX 的匹配规则,只是前缀变成了正则
43SELECT * FROM table_name WHERE content MATCH_REGEXP 'key.*';
44
45-- 3. 普通等值、范围、IN、NOT IN,正常的 SQL 语句即可,例如
46SELECT * FROM table_name WHERE id = 123;
47SELECT * FROM table_name WHERE ts > '2023-01-01 00:00:00';
48SELECT * FROM table_name WHERE op_type IN ('add', 'delete');
49
50-- 4. 多列全文检索匹配,通过 multi_match 函数完成
51-- 参数说明:
52--   前N个参数是要匹配的列名
53--   倒数第二个参数指定匹配模式:'any'/'all'/'phrase'/'phrase_prefix'
54--   最后一个参数是要搜索的关键词或短语
55
56-- 4.1 在col1,col2,col3任意一列中包含'keyword1'的行(OR逻辑)
57SELECT * FROM table_name WHERE multi_match(col1, col2, col3, 'any', 'keyword1');
58
59-- 4.2 在col1,col2,col3所有列中都包含'keyword1'的行(AND逻辑)
60SELECT * FROM table_name WHERE multi_match(col1, col2, col3, 'all', 'keyword1');
61
62-- 4.3 在col1,col2,col3任意一列中包含完整短语'keyword1'的行(精确短语匹配)
63SELECT * FROM table_name WHERE multi_match(col1, col2, col3, 'phrase', 'keyword1');
64
65-- 4.4 在col1,col2,col3任意一列中包含以'keyword1'开头的短语的行(短语前缀匹配)
66-- 例如会匹配"keyword123"这样的内容
67SELECT * FROM table_name WHERE multi_match(col1, col2, col3, 'phrase_prefix', 'keyword1');

通过 profile 分析索引加速效果

倒排查询加速可以通过 session 变量 enable_inverted_index_query 开关,默认是 true 打开,有时为了验证索引加速效果可以设置为 false 关闭。

可以通过 Query Profile 中的下面几个指标分析倒排索引的加速效果。

  • RowsInvertedIndexFiltered 倒排过滤掉的行数,可以与其他几个 Rows 值对比分析索引过滤效果
  • InvertedIndexFilterTime 倒排索引消耗的时间

    • InvertedIndexSearcherOpenTime 倒排索引打开索引的时间
    • InvertedIndexSearcherSearchTime 倒排索引内部查询的时间

用分词函数验证分词效果

如果想检查分词实际效果或者对一段文本进行分词行为,可以使用 TOKENIZE 函数进行验证。

TOKENIZE 函数的第一个参数是待分词的文本,第二个参数是创建索引指定的分词参数。

SQL
1SELECT TOKENIZE('武汉长江大桥','"parser"="chinese","parser_mode"="fine_grained"');
2+-----------------------------------------------------------------------------------+
3| tokenize('武汉长江大桥', '"parser"="chinese","parser_mode"="fine_grained"')       |
4+-----------------------------------------------------------------------------------+
5| ["武汉", "武汉长江大桥", "长江", "长江大桥", "大桥"]                              |
6+-----------------------------------------------------------------------------------+
7
8
9SELECT TOKENIZE('武汉市长江大桥','"parser"="chinese","parser_mode"="fine_grained"');
10+--------------------------------------------------------------------------------------+
11| tokenize('武汉市长江大桥', '"parser"="chinese","parser_mode"="fine_grained"')        |
12+--------------------------------------------------------------------------------------+
13| ["武汉", "武汉市", "市长", "长江", "长江大桥", "大桥"]                               |
14+--------------------------------------------------------------------------------------+
15
16
17SELECT TOKENIZE('武汉市长江大桥','"parser"="chinese","parser_mode"="coarse_grained"');
18+----------------------------------------------------------------------------------------+
19| tokenize('武汉市长江大桥', '"parser"="chinese","parser_mode"="coarse_grained"')        |
20+----------------------------------------------------------------------------------------+
21| ["武汉市", "长江大桥"]                                                                 |
22+----------------------------------------------------------------------------------------+
23
24
25SELECT TOKENIZE('I love PALO','"parser"="english"');
26+------------------------------------------------+
27| tokenize('I love PALO', '"parser"="english"') |
28+------------------------------------------------+
29| ["i", "love", "PALO"]                         |
30+------------------------------------------------+
31
32
33SELECT TOKENIZE('I love CHINA 我爱我的祖国','"parser"="unicode"');
34+-------------------------------------------------------------------+
35| tokenize('I love CHINA 我爱我的祖国', '"parser"="unicode"')       |
36+-------------------------------------------------------------------+
37| ["i", "love", "china", "我", "爱", "我", "的", "祖", "国"]        |
38+-------------------------------------------------------------------+

使用示例

用 HackerNews 100 万条数据展示倒排索引的创建、全文检索、普通查询,包括跟无索引的查询性能进行简单对比。

建表

SQL
1CREATE DATABASE test_inverted_index;
2
3USE test_inverted_index;
4
5-- 创建表的同时创建了 comment 的倒排索引 idx_comment
6--   USING INVERTED 指定索引类型是倒排索引
7--   PROPERTIES("parser" = "english") 指定采用 "english" 分词,还支持 "chinese" 中文分词和 "unicode" 中英文多语言混合分词,如果不指定 "parser" 参数表示不分词
8
9CREATE TABLE hackernews_1m
10(
11    `id` BIGINT,
12    `deleted` TINYINT,
13    `type` String,
14    `author` String,
15    `timestamp` DateTimeV2,
16    `comment` String,
17    `dead` TINYINT,
18    `parent` BIGINT,
19    `poll` BIGINT,
20    `children` Array<BIGINT>,
21    `url` String,
22    `score` INT,
23    `title` String,
24    `parts` Array<INT>,
25    `descendants` INT,
26    INDEX idx_comment (`comment`) USING INVERTED PROPERTIES("parser" = "english") COMMENT 'inverted index for comment'
27)
28DUPLICATE KEY(`id`)
29DISTRIBUTED BY HASH(`id`) BUCKETS 10
30PROPERTIES ("replication_num" = "1");

导入数据

通过 Stream Load 导入数据

Plain Text
1wget https://qa-build.oss-cn-beijing.aliyuncs.com/regression/index/hacknernews_1m.csv.gz
2
3curl --location-trusted -u root: -H "compress_type:gz" -T hacknernews_1m.csv.gz  http://127.0.0.1:8030/api/test_inverted_index/hackernews_1m/_stream_load
4{
5    "TxnId": 2,
6    "Label": "a8a3e802-2329-49e8-912b-04c800a461a6",
7    "TwoPhaseCommit": "false",
8    "Status": "Success",
9    "Message": "OK",
10    "NumberTotalRows": 1000000,
11    "NumberLoadedRows": 1000000,
12    "NumberFilteredRows": 0,
13    "NumberUnselectedRows": 0,
14    "LoadBytes": 130618406,
15    "LoadTimeMs": 8988,
16    "BeginTxnTimeMs": 23,
17    "StreamLoadPutTimeMs": 113,
18    "ReadDataTimeMs": 4788,
19    "WriteDataTimeMs": 8811,
20    "CommitAndPublishTimeMs": 38
21}

SQL 运行 count() 确认导入数据成功

SQL
1SELECT count() FROM hackernews_1m;
2+---------+
3| count() |
4+---------+
5| 1000000 |
6+---------+

查询

01 全文检索

  • 用 LIKE 匹配计算 comment 中含有 'OLAP' 的行数,耗时 0.18s

    SQL
    1SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%';
    2+---------+
    3| count() |
    4+---------+
    5|      34 |
    6+---------+
  • 用基于倒排索引的全文检索 MATCH_ANY 计算 comment 中含有'OLAP'的行数,耗时 0.02s,加速 9 倍,在更大的数据集上效果会更加明显

    这里结果条数的差异,是因为倒排索引对 comment 分词后,还会对词进行进行统一成小写等归一化处理,因此 MATCH_ANY 比 LIKE 的结果多一些

    SQL
    1SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLAP';
    2+---------+
    3| count() |
    4+---------+
    5|      35 |
    6+---------+
  • 同样的对比统计 'OLTP' 出现次数的性能,0.07s vs 0.01s,由于缓存的原因 LIKE 和 MATCH_ANY 都有提升,倒排索引仍然有 7 倍加速

    SQL
    1SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLTP%';
    2+---------+
    3| count() |
    4+---------+
    5|      48 |
    6+---------+

    SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLTP'; +---------+ | count() | +---------+ | 51 | +---------+

  • 同时出现 'OLAP' 和 'OLTP' 两个词,0.13s vs 0.01s,13 倍加速

    要求多个词同时出现时(AND 关系)使用 MATCH_ALL 'keyword1 keyword2 ...'

    SQL
    1SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%' AND comment LIKE '%OLTP%';
    2+---------+
    3| count() |
    4+---------+
    5|      14 |
    6+---------+
    7
    8
    9SELECT count() FROM hackernews_1m WHERE comment MATCH_ALL 'OLAP OLTP';
    10+---------+
    11| count() |
    12+---------+
    13|      15 |
    14+---------+
  • 任意出现 'OLAP' 和 'OLTP' 其中一个词,0.12s vs 0.01s,12 倍加速

    只要求多个词任意一个或多个出现时(OR 关系)使用 MATCH_ANY 'keyword1 keyword2 ...'

    SQL
    1SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%' OR comment LIKE '%OLTP%';
    2+---------+
    3| count() |
    4+---------+
    5|      68 |
    6+---------+
    7
    8
    9SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLAP OLTP';
    10+---------+
    11| count() |
    12+---------+
    13|      71 |
    14+---------+

02 普通等值、范围查询

  • DataTime 类型的列范围查询

    SQL
    1SELECT count() FROM hackernews_1m WHERE timestamp > '2007-08-23 04:17:00';
    2+---------+
    3| count() |
    4+---------+
    5|  999081 |
    6+---------+
  • 为 timestamp 列增加一个倒排索引

    SQL
    1-- 对于日期时间类型 USING INVERTED,不用指定分词
    2-- CREATE INDEX 是第一种建索引的语法,另外一种在后面展示
    3CREATE INDEX idx_timestamp ON hackernews_1m(timestamp) USING INVERTED;
    SQL
    1BUILD INDEX idx_timestamp ON hackernews_1m;
  • 查看索引创建进度,通过 FinishTime 和 CreateTime 的差值,可以看到 100 万条数据对 timestamp 列建倒排索引只用了 1s

    SQL
    1SHOW ALTER TABLE COLUMN;
    2+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    3| JobId | TableName     | CreateTime              | FinishTime              | IndexName     | IndexId | OriginIndexId | SchemaVersion | TransactionId | State    | Msg  | Progress | Timeout |
    4+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    5| 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031   | 10008         | 1:1994690496  | 3             | FINISHED |      | NULL     | 2592000 |
    6+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    SQL
    1-- 若 table 没有分区,PartitionName 默认就是 TableName
    2SHOW BUILD INDEX;
    3+-------+---------------+---------------+----------------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
    4| JobId | TableName     | PartitionName | AlterInvertedIndexes                                     | CreateTime              | FinishTime              | TransactionId | State    | Msg  | Progress |
    5+-------+---------------+---------------+----------------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
    6| 10191 | hackernews_1m | hackernews_1m | [ADD INDEX idx_timestamp (`timestamp`) USING INVERTED],  | 2023-06-26 15:32:33.894 | 2023-06-26 15:32:34.847 | 3             | FINISHED |      | NULL     |
    7+-------+---------------+---------------+----------------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
  • 索引创建后,范围查询用同样的查询方式,PALO 会自动识别索引进行优化,但是这里由于数据量小性能差别不大

    SQL
    1SELECT count() FROM hackernews_1m WHERE timestamp > '2007-08-23 04:17:00';
    2+---------+
    3| count() |
    4+---------+
    5|  999081 |
    6+---------+
  • 在数值类型的列 Parent 进行类似 timestamp 的操作,这里查询使用等值匹配

    SQL
    1SELECT count() FROM hackernews_1m WHERE parent = 11189;
    2+---------+
    3| count() |
    4+---------+
    5|       2 |
    6+---------+

    -- 对于数值类型 USING INVERTED,不用指定分词 -- ALTER TABLE t ADD INDEX 是第二种建索引的语法 ALTER TABLE hackernews_1m ADD INDEX idx_parent(parent) USING INVERTED;

    -- 执行 BUILD INDEX 给存量数据构建倒排索引 BUILD INDEX idx_parent ON hackernews_1m;

    SHOW ALTER TABLE COLUMN; +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+ | JobId | TableName | CreateTime | FinishTime | IndexName | IndexId | OriginIndexId | SchemaVersion | TransactionId | State | Msg | Progress | Timeout | +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+ | 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031 | 10008 | 1:1994690496 | 3 | FINISHED | | NULL | 2592000 | | 10053 | hackernews_1m | 2023-02-10 19:49:32.893 | 2023-02-10 19:49:33.982 | hackernews_1m | 10054 | 10008 | 1:378856428 | 4 | FINISHED | | NULL | 2592000 | +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+

    SHOW BUILD INDEX; +-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+ | JobId | TableName | PartitionName | AlterInvertedIndexes | CreateTime | FinishTime | TransactionId | State | Msg | Progress | +-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+ | 11005 | hackernews_1m | hackernews_1m | [ADD INDEX idx_parent (parent) USING INVERTED], | 2023-06-26 16:25:10.167 | 2023-06-26 16:25:10.838 | 1002 | FINISHED | | NULL | +-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+

    SELECT count() FROM hackernews_1m WHERE parent = 11189; +---------+ | count() | +---------+ | 2 | +---------+

  • 对字符串类型的 author 建立不分词的倒排索引,等值查询也可以利用索引加速

    SQL
    1SELECT count() FROM hackernews_1m WHERE author = 'faster';
    2+---------+
    3| count() |
    4+---------+
    5|      20 |
    6+---------+
    7
    8
    9-- 这里只用了 USING INVERTED,不对 author 分词,整个当做一个词处理
    10ALTER TABLE hackernews_1m ADD INDEX idx_author(author) USING INVERTED;
    11
    12
    13-- 执行 BUILD INDEX 给存量数据加上倒排索引:
    14BUILD INDEX idx_author ON hackernews_1m;
    15
    16
    17-- 100 万条 author 数据增量建索引仅消耗 1.5s
    18SHOW ALTER TABLE COLUMN;
    19+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    20| JobId | TableName     | CreateTime              | FinishTime              | IndexName     | IndexId | OriginIndexId | SchemaVersion | TransactionId | State    | Msg  | Progress | Timeout |
    21+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    22| 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031   | 10008         | 1:1994690496  | 3             | FINISHED |      | NULL     | 2592000 |
    23| 10053 | hackernews_1m | 2023-02-10 19:49:32.893 | 2023-02-10 19:49:33.982 | hackernews_1m | 10054   | 10008         | 1:378856428   | 4             | FINISHED |      | NULL     | 2592000 |
    24| 10076 | hackernews_1m | 2023-02-10 19:54:20.046 | 2023-02-10 19:54:21.521 | hackernews_1m | 10077   | 10008         | 1:1335127701  | 5             | FINISHED |      | NULL     | 2592000 |
    25+-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    26
    27SHOW BUILD INDEX order by CreateTime desc limit 1;
    28+-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
    29| JobId | TableName     | PartitionName | AlterInvertedIndexes                               | CreateTime              | FinishTime              | TransactionId | State    | Msg  | Progress |
    30+-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
    31| 13006 | hackernews_1m | hackernews_1m | [ADD INDEX idx_author (`author`) USING INVERTED],  | 2023-06-26 17:23:02.610 | 2023-06-26 17:23:03.755 | 3004          | FINISHED |      | NULL     |
    32+-------+---------------+---------------+----------------------------------------------------+-------------------------+-------------------------+---------------+----------+------+----------+
    33
    34
    35-- 创建索引后,字符串等值匹配也有明显加速
    36SELECT count() FROM hackernews_1m WHERE author = 'faster';
    37+---------+
    38| count() |
    39+---------+
    40|      20 |
    41+---------+

上一篇
冷热数据分层
下一篇
前缀索引与排序键