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 ...
随机推荐
- Rust 标准库 Trait 指南
部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...
- TornadoFx中的css美化
原文地址:TornadoFx中的css美化 - Stars-One的杂货小窝 TornadoFx中使用类重新对css进行了封装,所以可以用代码的形式来书写样式 说明 除了Text,其他的若是要修改文字 ...
- 【Django】HTML如何显示富文本内容
一.背景 我采用的前端样式是 LayUI,通过它的富文本编辑器保存内容到数据库后,遇到了一个回显到页面的问题 二.方案 在不考虑使用 Vue 的情况下,有一种简单的方式 <div id=&quo ...
- Linux 运维工程师面试真题-5-常考题目汇总
Linux 运维工程师面试真题-5-常考题目汇总 1.解释下什么是 GPL,GNU,自由软件? GPL:(通用公共许可证):一种授权,任何人有权取得.修改.重新发布自由软件的权力. GNU:(革奴计划 ...
- 记录--通过手写,分析async await核心原理
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 async await 语法是 ES7出现的,是基于ES6的 promise和generator实现的 generator函数 在之 ...
- Oracle 隐式数据类型转换
Oracle类型转换规则: 对于insert和update操作,oracle将值转换为受影响的的列的类型. 对于select操作,oracle会将列的值的类型转换为目标变量的类型. 看如下实验: 1. ...
- KingbaseES V8R3 集群运维系列 -- sync_flag参数配置
案例说明: 在KingbaseES V8R3集群一主二备的架构中,配置了流复制为同步(sync)模式,但是集群启动后,流复制状态中显示备库是async模式(备库和主库数据已经同步),从备库的rec ...
- List和ObservableCollection的转换
1.我们后台查询全部List数据的时候,前台需要ObservableCollection展示 这个时候List需要转换成ObservableCollection public static Obser ...
- 【已解决】aconda3 创建和切换jupyter Kernel(安装好了tensorflow在jupyter中无法使用)
如下图:在这里更换python环境内核(如果你把tensorflow安装在了一个新建的虚拟环境) 1. 创建新的环境(或者是直接激活进入已经安装了tensorflow的环境) conda create ...
- Python---flask框架实现修改密码功能
数据库部分: 1 #重置密码 2 def reset_pass(phone,password): 3 conn,cursor=get_conn() 4 sql="update userdat ...