V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Vimax
V2EX  ›  MySQL

mysql 主键用自增 id 还是雪花 id?

  •  
  •   Vimax · 2020-08-11 13:54:36 +08:00 · 7424 次点击
    这是一个创建于 1566 天前的主题,其中的信息可能已经有所发展或是发生改变。

    InnoDB 表的数据写入顺序能和 B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的。

    在数据表中,什么场景适合用主键 ID,什么场景适合雪花 ID ?

    25 条回复    2020-08-12 14:21:55 +08:00
    lenqu
        1
    lenqu  
       2020-08-11 14:23:55 +08:00   ❤️ 1
    个人观点,如果表数据不存在整列删除情况,主键 id 就很合适
    wellsc
        2
    wellsc  
       2020-08-11 14:24:26 +08:00 via iPhone   ❤️ 1
    雪花也可以自增的
    ifsclimbing
        3
    ifsclimbing  
       2020-08-11 14:33:48 +08:00   ❤️ 1
    分库分表用 雪花 id 吧
    opengps
        4
    opengps  
       2020-08-11 14:44:21 +08:00   ❤️ 1
    怕爬虫规律性穷举的一定不能用自增 id
    damai0419
        5
    damai0419  
       2020-08-11 16:23:16 +08:00
    雪花是递增趋势. 不是严格递增的吧. 不分库分表,感觉没必要上分布式 id.
    wangyzj
        6
    wangyzj  
       2020-08-11 16:24:45 +08:00
    业务量不是非常巨大,主键自增足够了
    love
        7
    love  
       2020-08-11 16:26:16 +08:00
    egfegdfr
        8
    egfegdfr  
       2020-08-11 16:40:44 +08:00
    看数据的重要性吧,一些非重要的数据就直接自增了(角色、权限), 重要数据用雪花 id (用户、产品、订单、 支付流水)
    takemeaway
        9
    takemeaway  
       2020-08-11 17:12:31 +08:00
    @opengps 现在爬虫还用穷举?
    @lenqu 删除也一样合适
    qwerthhusn
        10
    qwerthhusn  
       2020-08-11 17:20:42 +08:00   ❤️ 1
    用雪花,返回 json 时还要处理下格式,不然 js 读到大数字然后精度不足导致数据不对。。。
    PopRain
        11
    PopRain  
       2020-08-11 17:20:59 +08:00
    数据库主键最大的问题是获取主键需要访问数据库,如果有主从表,比较麻烦
    guisheng
        12
    guisheng  
       2020-08-11 17:21:02 +08:00
    目前采用主键自增+hashids 加密(就是处理麻烦了点其它目前无感)。
    sunmoon1983
        13
    sunmoon1983  
       2020-08-11 20:26:18 +08:00
    @qwerthhusn 对,我曾经也被这个问题困扰了,用了 json-bigint 也不好使,没办法,只能在后台先把 bigint 转成字符串再返回给前端
    EminemW
        14
    EminemW  
       2020-08-11 21:55:37 +08:00 via iPhone
    一起用
    littlewing
        15
    littlewing  
       2020-08-12 00:52:15 +08:00
    主键自增+一个雪花 ID
    yidinghe
        16
    yidinghe  
       2020-08-12 01:08:30 +08:00 via Android
    有需要 ID 严格递增的话就用自增
    locoz
        17
    locoz  
       2020-08-12 01:42:51 +08:00   ❤️ 1
    这问题在前面这个帖子( https://www.v2ex.com/t/686977 )里的文章和回复中有一堆例子,还有各种性能问题、部署问题之类的讨论,你可以看看。

    @takemeaway #9 能按 ID 顺序爬当然直接穷举 ID 啊,数据又全又不需要管列表页,增量还方便...
    xuanbg
        18
    xuanbg  
       2020-08-12 08:44:10 +08:00
    有条件当然不要用数据库自增。用自增有两个坏处:
    1 、id 可猜测,不对,应该是可预测。简直是为别人爬数据大开方便之门。
    2 、新增数据返回 id 还得额外费手脚,写主从数据时很恶心。
    xuanbg
        19
    xuanbg  
       2020-08-12 08:45:05 +08:00
    @xuanbg 忘了说第三个,分表后 id 会重复……要死了
    securityCoding
        20
    securityCoding  
       2020-08-12 09:51:41 +08:00
    @sunmoon1983 java 的话统一配置一下序列化策略就行了
    keshawnvan
        21
    keshawnvan  
       2020-08-12 10:35:09 +08:00
    分布式场景用雪花挺好的: https://juejin.im/post/6844904132550066183
    594duck
        22
    594duck  
       2020-08-12 11:27:44 +08:00
    如果不是百库百表而且要强一致没必要使用雪花 ID 吧。
    sunmoon1983
        23
    sunmoon1983  
       2020-08-12 12:56:18 +08:00
    @securityCoding 我用的 go,我不知道有没有那么 NB 的功能
    inwar
        24
    inwar  
       2020-08-12 13:47:12 +08:00 via Android
    @sunmoon1983 如果是 jackson 可以定义 Long 类型的序列化方式,直接转成 string
    yourssheng
        25
    yourssheng  
       2020-08-12 14:21:55 +08:00
    @damai0419 数据库主键也不是严格递增也会有 1,2,4,5 这种情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.