TairSearch:加速多列索引查询
简介: 互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能。然而业务场景如果是在数据库上做随意多列组合索引查询或者like模糊匹配查询,使用普通的KV缓存系统并不能完全承载住,往往需要引入lua或者外部计算等额外的联合查询匹配过滤机制。TairSearch是一个实时全内存检索服务,其核心的倒排索引
互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能。然而业务场景如果是在数据库上做随意多列组合索引查询或者like模糊匹配查询,使用普通的KV缓存系统并不能完全承载住,往往需要引入lua或者外部计算等额外的联合查询匹配过滤机制。TairSearch是一个实时全内存检索服务,其核心的倒排索引机制既能满足词根的模糊匹配查询,且可作为热数据存算一体加速任意多列组合索引的联合查询效率。本文将阐述TairSearch如何支持以上场景。
KV缓存在多列灵活查询场景的局限性
设计关系型数据库表时,除可设置主键索引,还可以设置多个二维索引,以及多种联合索引。
使用KV缓存服务时,以Redis为例,一般使用Hash结构映射关系型数据库字段。
将数据库表中的行记录导入到Redis的Hash结构中,以行中主键字段的值作为Redis hash的key,其他字段名作为hash的field,行字段的值作为hash的value。如果查询场景只涉及主键索引,在Redis中可以直接通过hmget的方式获取到行中指定字段的信息。但在以下场景中则有明显的局限性:
- 查询涉及二维索引,Redis中并不支持按hash中的field内容来查询,只能通过在Redis中再用Hash存储关系型数据库中的二维索引。不仅增加导入行数据的复杂程度,也因为冗余数据造成内存空间的膨胀。
- 查询涉及联合索引,Redis中并不支持对Hash类型的多key联合查询,用户侧只能在外部或者lua脚本中实现联合查询过滤规则,涉及到了数据的读取和挪动。
下文以支撑流量洪峰时期的机票搜索服务为例,讲述如何使用TairSearch加速任意多列组合索引的联合查询效率。
使用TairSearch加速多列组合索引的联合查询
以某机票搜索界面为模板,可以看到精准搜索机票涉及到几个关键条件:出发地、目的地、日期、经济/公务/头等舱、带儿童、带婴儿。查询结果带有多个航班信息。在暑期、国庆、春节等中长假期时间内,对热门旅游度假区的航班查询容易造成流量洪峰。
TairSearch如何支持这类的热门航旅查询需求?
TairSearch中存储所有待飞的航班信息,已航班的出发地departure 、 目的地destination 拼接作为keydeparture_destination 。因为航班中多个出发地_目的地在搜索航班中并无关联关系,所以key是相互独立的,可直接使用Tair分布式的集群架构存储,进一步提升并行查询能力。
出发地departure 、目的地destination 、日期date 、经济/公务/头等舱seat 、带儿童/带婴儿with 这几个字段建立索引。同时带有航班号flight_id 、价格price 、起飞时间departure_time 、降落destination_time 。如后期需要加字段,可直接使用tft.updateindex 毫秒级添加索引字段,业务无感知。
tft.createindex zhuhai_hangzhou '{
"mappings":{
"properties":{
"departure":{
"type":"keyword"
},
"destination":{
"type":"keyword"
},
"date":{
"type":"keyword"
},
"seat":{
"type":"keyword"
},
"with":{
"type":"keyword"
},
"flight_id":{
"type":"keyword"
},
"price":{
"type":"double"
},
"departure_time":{
"type":"long"
},
"destination_time":{
"type":"long"
}
}
}
}'
将航班信息按照以上字段整理成文档写入到TairSearch中。
tft.adddoc zhuhai_hangzhou '{
"departure":"zhuhai",
"destination":"hangzhou",
"date":"2022-09-01",
"seat":"first",
"with":"baby",
"flight_id":"CZ1000",
"price":986.1,
"departure_time":1661991010,
"destination_time":1661998210
}'
搜索头等舱的航班且按照航班的出发时间排序:
tft.search zhuhai_hangzhou '{
"sort":[
"departure_time"
],
"query":{
"bool":{
"must":[
{
"term":{
"date":"2022-09-01"
}
},
{
"term":{
"seat":"first"
}
}
]
}
}
}'
使用带use_cache的方式访问可以开启query cache的功能,query_cache的有效期是10s,可以对热点航班自带查询结果的热点缓存功能。
模拟随机写入10天内zhuhai_hangzhou有80个航班,且每个航班有6种配置的价格,压测查询的性能数据:
redis-benchmark -r 1 -n 500000 tft.search zhuhai_hangzhou '{"sort":["departure_time"], "query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}'
100.00% <= 3 milliseconds
20592.23 requests per second
开启query_cache:
redis-benchmark -r 1 -n 500000 tft.search zhuhai_hangzhou '{"sort":["departure_time"], "query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}' use_cache
100.00% <= 2 milliseconds
58920.57 requests per second
结语
TairSearch集缓存与计算于一体的全内存实时全文检索系统,可加速传统关系型数据多列组合查询效率。欢迎大家使用TairSearch产品,任何产品意见和更多的场景需求均可反馈给我们,TairSearch产品技术服务仍在持续迭代完善,期待您的参与。附TairSearch API文档
原文链接:https://click.aliyun.com/m/1000354007/
本文为阿里云原创内容,未经允许不得转载。
TairSearch:加速多列索引查询的更多相关文章
- HBase高性能复杂条件查询引擎---二级多列索引
http://www.infoq.com/cn/articles/hbase-second-index-engine 原理 “二级多列索引”是针对目标记录的某个或某些列建立的“键-值”数据,以列的值为 ...
- Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现
Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,last ...
- 认识SQLServer索引以及单列索引和多列索引的不同
一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使 ...
- mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)
没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...
- offset新探索:双管齐下,加速大数据量查询
摘要:随着offset的增加,查询的时长也会越来越长.当offset达到百万级别的时候查询时长通常是业务所不能容忍的. 本文分享自华为云社区<offset新探索:双管齐下,加速大数据量查询> ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- SQL Server-聚焦强制索引查询条件和Columnstore Index(九)
前言 本节我们再来穿插讲讲索引知识,后续再讲数据类型中的日期类型,简短的内容,深入的理解,Always to review the basics. 强制索引查询条件 前面我们也讲了一点强制索引查询的知 ...
- SQL Server 索引和表体系结构(包含列索引)
包含列索引 概述 包含列索引也是非聚集索引,索引结构跟聚集索引结构是一样,有一点不同的地方就是包含列索引的非键列只存储在叶子节点:包含列索引的列分为键列和非键列,所谓的非键列就是INCLUDE中包含的 ...
- oracle 单列索引 多列索引的性能测试
清除oralce 缓存:alter system flush buffer_cache; 环境:oracle 10g . 400万条数据,频率5分钟一条 1.应用场景: 找出所有站点的最新一条数据. ...
- Mysql的列索引和多列索引(联合索引)
转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test ( id ...
随机推荐
- 记springBoot一直报Exception authenticating MongoCredential.
项目场景: 场景:继上回docker安装好了mongo,然后自己本地项目尝试搭建使用连接mongo 问题描述: 按照别人写的文章教程一步步操作,最后自己本地尝试连接查询,跳出这个用户权限不够,发生了套 ...
- 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍
随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...
- 专访OV季军|毕业转为freelancer,他如何斩获大量CG奖项?
"新锐先锋,玩转未来"--首届实时渲染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视 ...
- View之invalidate,requestLayout,postInvalidate
目录介绍 01.invalidate,requestLayout,postInvalidate区别 02.invalidate深入分析 03.postInvalidate深入分析 04.request ...
- 【Leetcode】53. 最大子数组和
题目(链接) 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,-3, ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第4章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- [MySQL]细节、经验
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129922615 出自[进步* ...
- 《HelloGitHub》第 96 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- docker下载mongodb镜像并启动容器
1.查找mongodb相关镜像 docker search mongo 找到相关的镜像进行拉取,如果不指定版本,默认下载最新的mongoDB.建议自己先查找需要那个版本后在进行拉取,因为mongoDB ...
- RelationNet++:基于Transformer融合多种检测目标的表示方式 | NeurIPS 2020
论文提出了基于注意力的BVR模块,能够融合预测框.中心点和角点三种目标表示方式,并且能够无缝地嵌入到各种目标检测算法中,带来不错的收益 来源:晓飞的算法工程笔记 公众号 论文: RelationN ...