大数据查询

122 天前
 BuGoooo

需求:有 10 亿左右的数据需要做查询,想在毫秒内返回匹配结果

存入的内容如下

id cardno name short createtime
1 Dkmy48k7afjsG9T75BtTHOdssqCIyKtt Jack Ma DKyKtt nowtime

数据库存入的是这些数据,但是我匹配的话是通过 short 来匹配的,有什么好用的软件或方法吗?

付费求指导

2384 次点击
所在节点    数据库
47 条回复
BuGoooo
121 天前
@djangovcps 只用到 Elasticsearch 就够了吗?还需要其他的配合不?我 10 亿条都存一个分片还是多个分片合适呀
djangovcps
121 天前
看你 cpu 数量,5-10 个够用了,你这里只用 term 查询,如果用后四位的话,可以再存一份 reverse 的数据,直接用 es 提供的前缀 查询就行。
BuGoooo
121 天前
64C64G1TSSD 这个配置应该带的动

我先插入 1 亿条试试 感谢大哥指点
祝大哥年入千万
8355
121 天前
es 毫秒级无压力啊
分表以下做好分片和索引
unclejimao
121 天前
@COKETSANG 这种查 short_sub 的时候是不是就没法用索引了?是不是可以考虑使 partition by short_sub ,order by short ,查询的时候都带上 WHERE short_sub=? ,以减少分区扫描
COKETSANG
121 天前
@unclejimao 对,这个表如果这样设计单 short_sub 查询的时候是没法用索引。
我这里测试没有动脑粗暴的按 short 去分区了,按你说的优化固定带上 short_sub 是一种办法。
我还想过把 short 和 short sub 这俩字符串的转成 hash 数字多存两个数字 hash 字段,这样扫描后在代码里面二次匹配过滤。
不知道会不会更快,考虑到这俩字符串比较短碰撞可能性比较高可能是个负优化。
ldyisbest
121 天前
生成了 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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1112693

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX