关于后端:TairSearch加速多列索引查询

3次阅读

共计 2978 个字符,预计需要花费 8 分钟才能阅读完成。

简介:互联网及传统行业应用服务的要害数据个别存储在 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/10… 本文为阿里云原创内容,未经容许不得转载。

正文完
 0