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