如果一个表的几乎全部列加起来要求唯一,如果建唯一索引吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hackingwu
V2EX    程序员

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

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

    如果一个表的几乎全部列(除了一些创建时间,更新时间,创建人,更新人)加起来要求唯一,如果建唯一索引吗?因为每次查询也相当于全表扫描,但是又要求唯一限制。但是他的遍历 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     Solana     3065 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:44 PVG 20:44 LAX 05:44 JFK 08:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86