表格存储最佳实践:使用多元索引加速 SQL 查询

简介: 表格存储(Tablestore)在 2022 年 5 月正式发布了 SQL 商业化版本,业务上只需要在数据表上建立映射关系,就可以基于 SQL 引擎方便地对表格存储中的数据进行访问和计算,大大地降低了用户的学习成本。

表格存储(Tablestore)在 2022 年 5 月正式发布了 SQL 商业化版本,业务上只需要在数据表上建立映射关系,就可以基于 SQL 引擎方便地对表格存储中的数据进行访问和计算,大大地降低了用户的学习成本。下面以一个电商订单场景为例,介绍 SQL 的使用方式和加速策略。


场景介绍

某电商平台需要搭建订单管理系统,有一亿条订单明细数据保存在表格存储 Tablestore 的订单表 orders 中,用户创建了订单表的映射表,现需要通过 Tablestore SQL 来实现如下几个查询需求:


映射表结构

CREATETABLE `orders` (    `order_id` VARCHAR(1024) # 订单号,    `o_price` DOUBLE # 订单金额,    `o_time` BIGINT(20) # 下单时间,    `customer_name` MEDIUMTEXT # 顾客姓名,    `merchant_id` MEDIUMTEXT # 商家号,    `product_name` MEDIUMTEXT # 商品名,    PRIMARY KEY(`order_id`));

查询需求

  • 通过订单号查询订单。
  • 查询顾客一个月的购买记录。
  • 根据商品名检索订单。
  • 计算商家销售额排名。


无索引的 SQL 查询

当订单表 orders 上没有索引时使用 SQL 查询,SQL 引擎会采用 scan table + filter 的执行策略。

  1. 基于主键列的点查、范围查询,SQL 引擎扫描的数据量较小,返回速度较快,可以支持非常高的并发。例如上述订单场景的第一个查询需求,根据订单号 order_id 查询某一条订单明细。
select*from `orders` where order_id ='000017f7864f43608995f16e8a837b64'

  1. 当需要根据属性列字段来组合查询时,SQL 引擎扫描的数据会非常大,这会导致 SQL 查询性能下降,极端情况下可能会超过服务的限制,导致抛出 scan rows exceeds quota 错误。例如上述的第二查询需求,查询某顾客一个月内的购买记录,需要根据顾客姓名 customer_name 和下单时间 o_time 的范围来查询。SQL 引擎通过扫表的方式查询使得耗时急剧上升,如下示例:
select*from `orders` where customer_name ='顾客380'and o_time between1652688493000and1655366893782limit20;


基于多元索引的 SQL 查询


什么是多元索引

多元索引是建立数据表上的,采用倒排索引和列式存储等索引结构,提供了多字段组合查询、全文检索、地理位置查询等能力,同时可以支持轻量级的统计聚合。在数据表上建立多元索引后,SQL 引擎将自动选择最优的索引策略来大幅度提高查询性能,完全避免了 scan table 的查询方式带来的问题,同时能够支持更多的查询功能,例如全文检索。还是以上文的订单场景为例,来看看多元索引适用于哪些 SQL 查询场景。


创建多元索引

为了实现 SQL 查询加速和功能扩展,首先需要在 Tablestore 控制台上创建一个多元索引,多元索引创建后需要先等待表中的存量数据同步到索引中。


场景一:多字段组合查询

当需要使用多个属性列字段组合筛选数据时,利用多元索引的倒排索引特性,可以加速 SQL 语句的执行速度,避免整表扫描。例如查询顾客一个月的购买记录,可以看出同样的 SQL 查询耗时下降了 20 倍以上。

select*from `orders` where customer_name ='顾客380'and o_time between1652688493000and1655366893782limit20;


场景二:统计聚合

查询场景中需要对某个字段做聚合计算(Sum、Avg 等)或者按照某个字段进行分组时,SQL 引擎会利用多元索引的轻量级聚合能力。例如计算商家的销售额排名,需要按照商家号 merchant_id 分组并对订单金额 o_price 计算求和。

select merchant_id,sum(o_price)as sales from `orders` groupby merchant_id orderby sales desclimit3;


场景三:全文检索

全文检索是多元索引对 SQL 查询能力的扩展,当查询场景中需要对某个属性列的值进行全文检索,则需要依赖多元索引提供的分词和匹配查询功能。例如根据商品名检索订单,搜索商品名 product_name 中包含了 “笔” 的订单。

select*from `orders` where text_match(product_name,"笔","or","1")limit10;


总结

多元索引提供了在百亿数据规模下毫秒级检索的能力,当 SQL 查询场景中需要使用到多字段组合查询、统计聚合、全文检索等,通过在数据表上创建多元索引,能够带来极大的性能提升。更多关于 Tablestore SQL 的使用姿势和多元索引的功能介绍,欢迎参考表格存储 Tablestore 官方文档,或者加入“表格存储技术交流群 - 2”咨询,群内提供免费的在线专家服务,欢迎扫码加入,群号 23307953。

相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
7月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
10月前
|
SQL 存储 关系型数据库
SQL优化策略与实践:组合索引与最左前缀原则详解
本文介绍了SQL优化的多种方式,包括优化查询语句(避免使用SELECT *、减少数据处理量)、使用索引(创建合适索引类型)、查询缓存、优化表结构、使用存储过程和触发器、批量处理以及分析和监控数据库性能。同时,文章详细讲解了组合索引的概念及其最左前缀原则,即MySQL从索引的最左列开始匹配条件,若跳过最左列,则索引失效。通过示例代码,展示了如何在实际场景中应用这些优化策略,以提高数据库查询效率和系统响应速度。
441 10
|
11月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
12月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
449 2
|
存储 人工智能 NoSQL
Tablestore深度解析:面向AI场景的结构化数据存储最佳实践
《Tablestore深度解析:面向AI场景的结构化数据存储最佳实践》由阿里云专家团队分享,涵盖Tablestore十年发展历程、AI时代多模态数据存储需求、VCU模式优化、向量检索发布及客户最佳实践等内容。Tablestore支持大规模在线数据存储,提供高性价比、高性能和高可用性,特别针对AI场景进行优化,满足结构化与非结构化数据的统一存储和高效检索需求。通过多元化索引和Serverless弹性VCU模式,助力企业实现低成本、灵活扩展的数据管理方案。
748 12
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
270 3
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
2561 5
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
SQL 存储 关系型数据库
SQL默认索引是什么
在SQL数据库中,索引是一种用于提高查询性能的数据结构
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引
在数据库管理和优化过程中,确认SQL查询是否使用了索引是一个至关重要的步骤