如果一个表的几乎全部列加起来要求唯一,如果建唯一索引吗

2020-05-11 12:46:56 +08:00
 hackingwu

如果一个表的几乎全部列(除了一些创建时间,更新时间,创建人,更新人)加起来要求唯一,如果建唯一索引吗?因为每次查询也相当于全表扫描,但是又要求唯一限制。但是他的遍历 IO 是顺序的,而且几乎我要查询的列都在索引中(覆盖索引)我觉得肯定是比全表扫描快的。但是是否有必要再建个索引,或者有什么更好的做法吗?

2953 次点击
所在节点    程序员
17 条回复
reus
2020-05-11 12:49:46 +08:00
机翻语文,看不懂
n0tyet
2020-05-11 13:24:39 +08:00
如果仅仅是为了要求唯一。。。
为什么不程序全部列一起计算 hash
这样只需要处理一个列
pmispig
2020-05-11 13:26:53 +08:00
写个函数计算这几个列字符串拼接的 md5 值,以后就直接看 md5 值就可以了
whileFalse
2020-05-11 13:35:30 +08:00
ls 说的 hash 是一个办法,不过更新就挺麻烦的。
sadfQED2
2020-05-11 13:36:41 +08:00
由业务代码保证唯一,或者像上面老哥说的所有列拼起来计算 md5
blackboom
2020-05-11 13:36:47 +08:00
@n0tyet Hash 还是会有冲突的
abcbuzhiming
2020-05-11 13:38:03 +08:00
说 hash 的没考虑过数据量稍微上来一点就是会撞的这个问题吗?
reus
2020-05-11 13:47:37 +08:00
@blackboom
@abcbuzhiming sha256 你撞一个,那可是世界级新闻
Mithril
2020-05-11 13:58:13 +08:00
@reus Hash 包括 SHA 都是保证你难以人为做出碰撞。而不是说自然情况下不会产生碰撞。
Muninn
2020-05-11 14:01:10 +08:00
可能是我运气好吧 我用了很多年 还没撞过 笑
Mithril
2020-05-11 14:04:44 +08:00
你可以直接用 MD5,或者其他更简单的摘要算法对你全列加和做个 hash,然后对保存这个数值的列做聚类索引。
检索的时候把这个列作为优先条件,然后再查你的条件。这样保证可以快速过滤数据,又可以保证碰撞不会影响最终结果。
xupefei
2020-05-11 14:16:11 +08:00
用一个列做索引,然后字符串拼贴后做 bloom filter 。
插入数据时,如果在 bloom filter 里发现冲突,就用索引去一个一个检查冲突项。
reus
2020-05-11 14:28:47 +08:00
@Mithril bitcoin 就是用 sha256,现在全世界不知道多少算力用在算 sha256 上,一个已知的碰撞都没有出现过。
Hstar
2020-05-11 14:30:07 +08:00
这个思路就是表中单独一列存摘要,摘要可以纯拼接字符串或者用摘要算法算一个,如果存在有几列的数据可能会很长那么只能用摘要算法。
数据里不大的情况下不需要关心摘要碰撞,如果有强唯一需求,可以用碰撞概率更低的摘要算法或者业务逻辑上先检查摘要一致再逐列检查是否一致。
reus
2020-05-11 14:36:26 +08:00
@Mithril 就算是更弱的 sha1,也从来没有在你说的“自然情况下”出现过碰撞。直到 2017 年才出现人为构造的碰撞,和你的理解恰恰相反: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
RuiQ
2020-05-11 15:44:59 +08:00
哈希索引
fzhyzamt
2020-05-11 17:25:31 +08:00
用 crc32 作账号唯一键 id 几年没撞过

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

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

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

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

© 2021 V2EX