2000W 个不重复的 32 位长字符串存于 mysql 中,现在怎样判断该数据表中存在某个特定值?

2017-02-15 17:38:20 +08:00
 Reign

目前的业务逻辑是,有 2000W 个 32 位长字符串存在 mysql 中,该 mysql 表就只有 2 个字段,自增 id 和 hash ,现在要验证这个表中是否存在某个 hash 值,怎样用最简单快速的方法查询?我想到过用 redis 来存,但是内存吃不消,有没有好的解决方案?谢谢

3764 次点击
所在节点    程序员
37 条回复
eote
2017-02-15 17:39:22 +08:00
排序+binary search
eote
2017-02-15 17:40:29 +08:00
或者 bitmap
forestyuan
2017-02-15 17:44:57 +08:00
建个索引然后用 SQL 查询就行了吧
withlqs
2017-02-15 17:46:09 +08:00
字典树
Reign
2017-02-15 17:46:57 +08:00
@forestyuan 感觉有点慢 硬盘很渣
allenhu
2017-02-15 17:47:44 +08:00
加多一列 crc ,存 crc32 ( hash ),然后 加 index idx_crc(crc32),配合缓存,速度不会太慢。
freeminder
2017-02-15 17:48:06 +08:00
bloom filter?
liuxu
2017-02-15 17:49:04 +08:00
这。。该 hash 分表了,根据 hash 最后 2-3 位分成 100-1000 个表。
XiaoFaye
2017-02-15 17:49:13 +08:00
@Reign 升级硬件能解决的问题,绝对不要浪费技术人员的时间。极有可能所花时间的价值已经远远超过硬件的价值。
w2exzz
2017-02-15 17:49:28 +08:00
显然是再增加一列啊……这一列保存 hash 值…… hash 值留 8 位就行了

然后搜索的时候先匹配 hash 值,匹配到了再匹配全部内容。都一致就找到了。
hash 不一致就 pass
forestyuan
2017-02-15 17:56:20 +08:00
如果自己写算法,一来容易有 BUG ,二来也不一定比数据库引擎优化的好。
Michaelssss
2017-02-15 18:00:00 +08:00
2000W 好像建个索引就完事了。。。。这数据量不大。。。 5~10MS 都出来了。。。
redis 你没必要全部扔进去啊,- -查询成功一次扔一次,缓存成功就直接走缓存,缓存失败再去 mysql ,这才是缓存的意义啊
Michaelssss
2017-02-15 18:02:28 +08:00
如果要自己写算法就是 boolean filter
jianzhiyao020
2017-02-15 18:14:26 +08:00
建索引啊,有这么复杂?
cloudzhou
2017-02-15 18:21:07 +08:00
@allenhu 方法可行

另外有一个取巧的方法,需要更改一下业务:
就是 hash 里面隐含着 id

我详细解释一下,比如在生成 hash 的时候(大部分是随机值)
hash 值为空,先 save 一下,得到自增 id ,比如 1000 ,然后简单的用 36 进制表示,就是 rs
然后命名规则如下:
1 位是表示 36 进制长度 + N 位是 36 进制值 + ( 32-1-N )位随机值

然后 update set hash = '...' where id = 1000 更新进去

例子,比如 1000 ,那么表示为 2rs...
这样, hash 里面直接可以获取 id ,然后取出来直接进行字符匹配,判断是否正确。
allenhu
2017-02-15 18:28:55 +08:00
@cloudzhou 嗯,这个问题,不知道的还一通乱答, v 站水平也是参差不齐。
allenhu
2017-02-15 18:33:18 +08:00
@cloudzhou 你说的这个方法有点意思,但是好像并不能解决 lz 说的问题,因为一开始,你是没法知道自增 id 是多少的,你知道的只是后面那部分
manhere
2017-02-15 18:34:29 +08:00
彩虹表?
Abirdcfly
2017-02-15 18:37:15 +08:00
建索引,挺快的。
ichou
2017-02-15 19:39:05 +08:00
2000 万数据量不大啊,感觉有索引不至于慢到不能接受哦

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

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

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

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

© 2021 V2EX