V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hackingwu
V2EX  ›  程序员

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

  •  
  •   hackingwu ·
    hackingwu · 2020-05-11 12:46:56 +08:00 · 2733 次点击
    这是一个创建于 1417 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2020-05-11 17:25:31 +08:00
    reus
        1
    reus  
       2020-05-11 12:49:46 +08:00   ❤️ 4
    机翻语文,看不懂
    n0tyet
        2
    n0tyet  
       2020-05-11 13:24:39 +08:00 via Android   ❤️ 1
    如果仅仅是为了要求唯一。。。
    为什么不程序全部列一起计算 hash
    这样只需要处理一个列
    pmispig
        3
    pmispig  
       2020-05-11 13:26:53 +08:00
    写个函数计算这几个列字符串拼接的 md5 值,以后就直接看 md5 值就可以了
    whileFalse
        4
    whileFalse  
       2020-05-11 13:35:30 +08:00
    ls 说的 hash 是一个办法,不过更新就挺麻烦的。
    sadfQED2
        5
    sadfQED2  
       2020-05-11 13:36:41 +08:00 via Android
    由业务代码保证唯一,或者像上面老哥说的所有列拼起来计算 md5
    blackboom
        6
    blackboom  
       2020-05-11 13:36:47 +08:00 via Android
    @n0tyet Hash 还是会有冲突的
    abcbuzhiming
        7
    abcbuzhiming  
       2020-05-11 13:38:03 +08:00
    说 hash 的没考虑过数据量稍微上来一点就是会撞的这个问题吗?
    reus
        8
    reus  
       2020-05-11 13:47:37 +08:00
    @blackboom
    @abcbuzhiming sha256 你撞一个,那可是世界级新闻
    Mithril
        9
    Mithril  
       2020-05-11 13:58:13 +08:00
    @reus Hash 包括 SHA 都是保证你难以人为做出碰撞。而不是说自然情况下不会产生碰撞。
    Muninn
        10
    Muninn  
       2020-05-11 14:01:10 +08:00
    可能是我运气好吧 我用了很多年 还没撞过 笑
    Mithril
        11
    Mithril  
       2020-05-11 14:04:44 +08:00
    你可以直接用 MD5,或者其他更简单的摘要算法对你全列加和做个 hash,然后对保存这个数值的列做聚类索引。
    检索的时候把这个列作为优先条件,然后再查你的条件。这样保证可以快速过滤数据,又可以保证碰撞不会影响最终结果。
    xupefei
        12
    xupefei  
       2020-05-11 14:16:11 +08:00 via iPhone
    用一个列做索引,然后字符串拼贴后做 bloom filter 。
    插入数据时,如果在 bloom filter 里发现冲突,就用索引去一个一个检查冲突项。
    reus
        13
    reus  
       2020-05-11 14:28:47 +08:00
    @Mithril bitcoin 就是用 sha256,现在全世界不知道多少算力用在算 sha256 上,一个已知的碰撞都没有出现过。
    Hstar
        14
    Hstar  
       2020-05-11 14:30:07 +08:00
    这个思路就是表中单独一列存摘要,摘要可以纯拼接字符串或者用摘要算法算一个,如果存在有几列的数据可能会很长那么只能用摘要算法。
    数据里不大的情况下不需要关心摘要碰撞,如果有强唯一需求,可以用碰撞概率更低的摘要算法或者业务逻辑上先检查摘要一致再逐列检查是否一致。
    reus
        15
    reus  
       2020-05-11 14:36:26 +08:00
    @Mithril 就算是更弱的 sha1,也从来没有在你说的“自然情况下”出现过碰撞。直到 2017 年才出现人为构造的碰撞,和你的理解恰恰相反: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
    RuiQ
        16
    RuiQ  
       2020-05-11 15:44:59 +08:00
    哈希索引
    fzhyzamt
        17
    fzhyzamt  
       2020-05-11 17:25:31 +08:00
    用 crc32 作账号唯一键 id 几年没撞过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1009 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:02 · PVG 06:02 · LAX 15:02 · JFK 18:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.