@lmshl 笑死,你发的东西,你都不看一下嘛? pg_trgm ignores non-word characters (non-alphanumerics) when extracting trigrams from a string.
这种需求,是没办法用索引的,所以无论什么数据库,包括 ES 、Click House 、Redis 、PG 甚至 Oracle ,都不好使,只能用硬件去硬抗。2 楼老哥说对了。 可以使用基于区域或散列,进行分片,用很多物理机去扛,每台物理机扛一个分片。简单一些可以用 MongoDB ,天生分布式 + 分片。需要高性能那就用 Redis 集群,大内存,数据提前加载到内存里。 话说回来,这种需求,虽然提高了用户体验,但真的烧钱。公司没钱的话,不建议这么做。
另外,是否考虑修改需求,比如淘宝业务,用户的查询范围只是自己的订单,菜鸟驿站老板查询的范围只是他的驿站范围,那么可以通过剪枝 + 数据冗余的方法,空间换时间,能控制到一个比较理想的性能范围。 然后查询接口,再按时间进行分区:最近 3 个月内是默认查询,如果要查询所有时间范围,就让他们排队查询,或查询结果异步通知。
可以试试 starrocks ,语法跟 mysql 兼容,业务代码可能改动很小甚至不需改动 数据分区存,创建表让数据按年份存到不同桶 测试了一张表,dbeaver 显示它有 64G select count(*) from table 耗时: 1m7s 结果: 16007223598 整张表有 160 亿数据 like 查询过去半年数据,time >= '2024-05-01 00:00:00' and a like '%keyword%' limit 2000 ,耗时 3s 左右
@laminux29 笑死, 上网不带脑子 一亿行 pgtrgm 不做分区直接搜, 平均时间也不到 200ms, 要什么集群分片硬件硬扛? 单核 pg, 一年百十块搞定的需求, 照你的方案没个几百万硬件成本怎么玩