需求:有 10 亿左右的数据需要做查询,想在毫秒内返回匹配结果
存入的内容如下
id | cardno | name | short | createtime |
---|---|---|---|---|
1 | Dkmy48k7afjsG9T75BtTHOdssqCIyKtt | Jack Ma | DKyKtt | nowtime |
数据库存入的是这些数据,但是我匹配的话是通过 short 来匹配的,有什么好用的软件或方法吗?
付费求指导
1
cbythe434 2 天前
short 没啥含义直接 kv 查询的? redis ?
|
2
threeBoy 2 天前
单表大数据? clickhouse
|
3
shuangbiaog 2 天前
10 亿上 ES 吧
|
5
BuGoooo OP @shuangbiaog 可以用分表,10 亿条,es 能干毫秒内吗 铁铁
|
7
COKETSANG 2 天前
是 short like 还是需要怎么查?单列查询感觉 clickhouse 的 prewehre 场景蛮合适的
|
8
BuGoooo OP @COKETSANG like 应该不行吧,因为我的想法是 先查全部,如果不满足就只要后面 4 个
以我举例的为例,先查询 DKyKtt ,如果没查到则查询 yKtt 的数据 给返回 |
9
COKETSANG 2 天前
@BuGoooo 你可以用 ck 测下,short 一列,sub_short 后 4 位一列。理论上适合 clickhouse 单列 prewhere 应该很快,但是 ck 的 qps 支持不会特别高,qps 比较高的场景建议你试试看 doris
|
10
shuangbiaog 2 天前
@BuGoooo 内存给够,有啥不行的
|
11
sunjiayao 2 天前
加一列 short_reversed 存数据 reverse(short), 分别给 short 和 short_reversed 加索引。10 亿数据洒洒水啦
|
13
BuGoooo OP @shuangbiaog HAHA 是是是 内存够 啥都能干 ,哪像这种 10 亿级的数据,128g 的内存够不
|
![]() |
15
RandomJoke 2 天前
你要分表的话,如果能保证均匀分布,100 张表,单表不就 1kw 了,索引直出问题不大了吧。。如果你说 1ms 以内,感觉必须得内存了吧。。
|
17
BuGoooo OP @RandomJoke mysql 分表,单表 1kw 的数据,100 张就够了 。但是你的意思是这种情况下最好就是数据能均匀分布到每个表里,如果想提高查询效率,我服务器的内存得拉起来吗
|
![]() |
18
RandomJoke 2 天前
@BuGoooo 数据在硬盘里的话,怎么估计也不能 1ms 以内,你拉高内存加快本质上不就是从内存出。。
|
19
BuGoooo OP |
![]() |
21
guanhui07 2 天前
建议上 ES 吧 。
|
![]() |
22
RandomJoke 2 天前
@BuGoooo 毫秒内还是毫秒级别啊- -,你说的 1s 以内的话,单表 1000w ,走索引应该都行,关键在于你怎么尽量保证他均匀分布,常见的列式存储和倒排查询比如 ES CH 1s 以内还是比较轻松的
|
23
BuGoooo OP @RandomJoke 1s 不是 1ms 哈哈 1 秒内
|
24
hashakei 2 天前
字节 redis 不行么? key 是 short, value 是一个这一行值的 json
|
26
COKETSANG 2 天前
|
![]() |
27
xinyewdz 2 天前
如果一天只有几千的查询,clickhouse 可以的。ES 查询估计够呛
|
28
hashakei 2 天前
@BuGoooo #25 可以用 redis 的 hash ,或者 redis 的 string ,存的是 json 格式,不会慢的,redis 的 kv 查询跟数据量没啥关系,就是比较费内存。
|
29
hashakei 2 天前
|
30
BuGoooo OP @hashakei 哇哦 这个可以,redis 的 kv 支持模糊吗? 比如我的查 DKyKtt 的时候,如果没有符合的 我就再查 yKtt (降低条件)这样来寻找匹配的数据
|
![]() |
33
superchijinpeng 2 天前
starrocks
|
34
crysislinux 2 天前 via Android
@BuGoooo redis 有全文搜索插件,就是要算算这么多数据放得下不。
|
![]() |
35
yufeng0681 2 天前
10 亿级别的数据查询,要想办法分开,增加维度让查询的数量级降到千万条数据,这样才能体现出来你的价值(做过设计)。
自己作为消费者,老吐槽 app 越来越大,越来越慢,内存大都被 app 吃掉了。app 开发者就是偷懒,不做设计,业务功能堆堆堆上去,反正手机不停硬件升级 |
36
zhangshenglong52 2 天前
@BuGoooo redis key 支持模糊检索 keys *yKtt 可以模糊匹配( keys 不推荐用,会阻塞线程导致 redis 不可用),或者用 SCAN 也支持模糊匹配。
|
![]() |
37
djangovcps 2 天前
elasticsearch 可以做到 15ms ,但是内存至少 32G 起步,机器配置不够查询不太行。
|
![]() |
38
sagaxu 2 天前
10 亿条,索引也就 4 层,short 区分度高的话,内存搞个 32G ,索引全装内存里,随便哪个数据库完整匹配或者后四位都不会超过 1 秒
|
39
BuGoooo OP @djangovcps 单机单节点吗 机器配置可以高点 能带的动不
|
![]() |
40
djangovcps 1 天前
能带动,16 核 64G ,单机没问题。
|
41
BuGoooo OP @djangovcps 只用到 Elasticsearch 就够了吗?还需要其他的配合不?我 10 亿条都存一个分片还是多个分片合适呀
|
![]() |
42
djangovcps 1 天前
看你 cpu 数量,5-10 个够用了,你这里只用 term 查询,如果用后四位的话,可以再存一份 reverse 的数据,直接用 es 提供的前缀 查询就行。
|
43
BuGoooo OP 64C64G1TSSD 这个配置应该带的动
我先插入 1 亿条试试 感谢大哥指点 祝大哥年入千万 |
![]() |
44
8355 1 天前
es 毫秒级无压力啊
分表以下做好分片和索引 |
![]() |
45
unclejimao 1 天前
@COKETSANG 这种查 short_sub 的时候是不是就没法用索引了?是不是可以考虑使 partition by short_sub ,order by short ,查询的时候都带上 WHERE short_sub=? ,以减少分区扫描
|
46
COKETSANG 1 天前
@unclejimao 对,这个表如果这样设计单 short_sub 查询的时候是没法用索引。
我这里测试没有动脑粗暴的按 short 去分区了,按你说的优化固定带上 short_sub 是一种办法。 我还想过把 short 和 short sub 这俩字符串的转成 hash 数字多存两个数字 hash 字段,这样扫描后在代码里面二次匹配过滤。 不知道会不会更快,考虑到这俩字符串比较短碰撞可能性比较高可能是个负优化。 |
![]() |
47
ldyisbest 1 天前
生成了 1 亿数据,使用 duckdb 在 short 上建索引,查询效果如下,10 亿应该毫无压力
D select count(*) from user_info; Total Time: 0.0241s count_star() int64 100000000 Run Time (s): real 0.026 user 0.067518 sys 0.052258 D select * from user_info where short = 'lHmQkx' limit 10; Total Time: 0.0028s cardno name short varchar varchar varchar JMasgl4pEtpVoadYedJEFAGcOR6xgesN YykPH lHmQkx Run Time (s): real 0.006 user 0.001355 sys 0.001915 D |