实际工程中的十亿条数据完全匹配查询

2021 年 2 月 3 日
 beryl

也算是一道常见的算法题:有十亿条 URL,来了一个新的 URL 判断是否在里面,提供在线服务

但是想着优先使用 mysql 查询,其次 ES, 想布隆过滤器等不适合在工程应用,要保证准确

现有思路,将 url 进行 md5 存储,作为主键 key 分表放在数据库。

但是不清楚具体这种情况下效率会是怎么样

4023 次点击
所在节点    程序员
22 条回复
F281M6Dh8DXpD1g2
2021 年 2 月 3 日
为啥 bloom 过滤器不行?
Jooooooooo
2021 年 2 月 3 日
"布隆过滤器等不适合在工程应用" "要保证准确"

没有理解布隆的精髓啊
rahuahua
2021 年 2 月 3 日
@Jooooooooo 楼主这种情况确实不适合 bloom 呀
lanmoyingsheng
2021 年 2 月 3 日
布隆过滤可以保证不存在。
感觉先布隆过滤,如果不存在直接返回;如果存在 再查 ES 或 mysql ;
liuxu
2021 年 2 月 3 日
用 crc64 可以小一点,md5 得 32 位 char 做索引,然后 hash 拆库
dongtingyue
2021 年 2 月 3 日
es 为啥不能保证准确?
sampeng
2021 年 2 月 3 日
请问…用数据库,es 实现了。还考个什么算法?
herozzm
2021 年 2 月 3 日
@dongtingyue #6 es 更新不能及时体现,只能说接近即时
liuzhaowei55
2021 年 2 月 3 日
热数据放缓存,key hash 后分表,数据库如果用 mongo 单表 2 亿数据,加个索引就行了基本不需要特殊优化。
swulling
2021 年 2 月 3 日
不需要数据库,使用 Hash 表就可以了,先做 Hash,然后进行取模 Mod N,分布到 N 个 Hash 表里。

估计需要 3 台 128G 内存的物理机就足够了。
tisswb
2021 年 2 月 3 日
url 的话 那就先格式化,然后 md5,然后 redis
fengpan567
2021 年 2 月 3 日
ES 为啥不能保证准确性?更新延迟?
love
2021 年 2 月 3 日
md5 太大了,64 位 hash 算法如 xxhash 足够,hash 加个索引 where hash = ? and url = ?就行了
THESDZ
2021 年 2 月 3 日
拆分 模拟树结构就好了
aeli
2021 年 2 月 3 日
10 亿 url,做成短链?
tf2
2021 年 2 月 3 日
先申请 10 万台服务器,每个服务器存 1 万条数据。这样是不是就简单了。2333
simple2025
2021 年 2 月 3 日
感觉可以 md5 hash,要是觉得长, 可以只存前 16 位呀
wangdashuai
2021 年 2 月 3 日
可以构造前缀树,这样可以压缩数据大小.
abersheeran
2021 年 2 月 3 日
@wangdashuai 压缩前缀树面对十亿这个量级还是不够用的。我之前试过。

楼主这个需求,如果只是判断是否在里面,布隆过滤器就够了。十亿数据,根据最优概率公式算出来,错误率控制在万分之一左右,我记得也就一个多 GB 。

一份之前用过的 Python 代码贴出来以供参考:

https://gist.github.com/abersheeran/210f5c1a6f36721302f755e39a242e50
abersheeran
2021 年 2 月 3 日
@abersheeran 如果要精准判断,这里就需要上一个 kv 索引了。这个参考一下 HBase 之类的数据库做法就行,也没啥别的好办法。

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

https://www.v2ex.com/t/750893

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

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

© 2021 V2EX