› 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
daoqiongsi1101
V2EX  ›  MySQL

关于 MySQL 建表主键用自增还是 uuid 的问题

  •  
  •   daoqiongsi1101 · Dec 13, 2021 · 8182 views
    This topic created in 1746 days ago, the information mentioned may be changed or developed.

    关于 MySQL 建表主键 id 字段的类型,目前有这几种:

    1. 一个自增数字作为主键 id
    2. 一个无序的 uuid 作为 id
    3. 一个有序的 uuid 作为 id
    4. 一个业务 uuid (无序)作为 id ,一个自增字段 incr_id

    InnoDB 引擎,主键 id 有序能利用其优势。

    第 1 种,对于敏感的数据,容易根据 id 增长暴露增量;

    第 2 种,没利用到 B+ Tree 的特性;

    第 3 种,要引入 snowflake 等算法生成器;

    第 4 种,其实是第 2 种的变体,加一个 incr_id 自增字段,在分页的时候用到

    大家讨论一下,在 2021 年,那种主键 id 类型是推荐的?

    36 replies  •  2021-12-14 10:14:11 +08:00
    xuanbg
        1
    xuanbg  
       Dec 13, 2021
    雪花 ID
    Fly4J
        2
    Fly4J  
       Dec 13, 2021
    snowflake
    ylz
        3
    ylz  
       Dec 13, 2021   ❤️ 3
    第一个的问题可以用 https://hashids.org/
    love2020
        4
    love2020  
       Dec 13, 2021   ❤️ 5
    在使用 InnoDB 存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键
    TUNGH
        5
    TUNGH  
       Dec 13, 2021
    要么自增,要么雪花
    initdada
        6
    initdada  
       Dec 13, 2021
    分布式 ID 生成器 参考 Tinyid 、Leaf
    Feiex
        7
    Feiex  
       Dec 13, 2021
    既然业务 id 敏感,我推荐 3 ,加上防止回退做成 sdk 就好了,大家一起用也不用关系细节
    mokeyjay
        8
    mokeyjay  
       Dec 13, 2021
    UUID 在实践中遇到了一些麻烦的问题
    所以目前我们在建表和逻辑代码中用自增主键 id ,但这个 id 对外展示前会经过 #3 提到的 hashids 哈希后展示
    onhao
        9
    onhao  
       Dec 13, 2021
    我们是网文行业, 采用自增方式, 然后发现败的一塌糊涂, 不过在哪里摔倒就在哪里爬起来, 我们还是坚持采用自增, 不过对自增 ID 做了对应的处理, 通过自定义函数,算出一个不重复的字符串,然后创建一个视图。完美解决。
    lichao
        10
    lichao  
       Dec 13, 2021   ❤️ 1
    @mokeyjay 分享一下,什么样的麻烦?
    FawkesV
        11
    FawkesV  
       Dec 13, 2021
    雪花 ID 吧
    C02TobNClov1Dz56
        12
    C02TobNClov1Dz56  
       Dec 13, 2021
    @lichao 无序 uuid 容易造成索引重排, 写入性能很低.
    而自增的, 只要追加到索引的最后即可.
    zzzmj
        13
    zzzmj  
       Dec 13, 2021
    自增 id 再加一个 uid 索引=。=
    815979670
        14
    815979670  
       Dec 13, 2021
    用 UUID 的话可以考虑使用 `UUID_TO_BIN()` MySQL8.0 新增函数,将 uuid 转为二进制,转换后是一个 varchar(16) 的值。(做主键即能代替 id 自增,又能解决 uuid 做主键性能不好的问题)
    tabris17
        15
    tabris17  
       Dec 13, 2021
    > 第 1 种,对于敏感的数据,容易根据 id 增长暴露增量;

    自增 ID+hashids 加密就行了
    chotow
        16
    chotow  
       Dec 13, 2021
    分享一个从 V 友那里学到的,使用 MySQL 自带函数 UUID_SHORT: /t/802473 #1
    makelove
        17
    makelove  
       Dec 13, 2021
    uuid 太大了,不但在主表上且每个索引的每个项都会包含这个 uuid 指回主表,简直过于浪费内存
    没有业务必要自增足够好了
    onhao
        18
    onhao  
       Dec 13, 2021
    可以参考下, 我们的方案 自定义函数+视图的方法 https://wuhao.pw/archives/282/
    Numbcoder
        19
    Numbcoder  
       Dec 13, 2021   ❤️ 1
    把 MySQL 换成 PG ,就没这些月经问题了
    FallenTy
        20
    FallenTy  
       Dec 13, 2021
    自增 ID 作为数据库主键,再用 uuid 作为接口查询参数,自增 ID 仅用于数据库关联查询
    NBY
        21
    NBY  
       Dec 13, 2021
    @Numbcoder 严重同意
    PG 这么好用为啥不用 PG 呢
    imnpc
        22
    imnpc  
       Dec 13, 2021
    建议使用自增 ID 然后 使用 hashid 对外输出和解密
    niubee1
        23
    niubee1  
       Dec 13, 2021
    MySQL 用 uuid 有性能问题,最好是自增
    whoosy
        24
    whoosy  
       Dec 13, 2021
    用自增 uuid
    fangcan
        25
    fangcan  
       Dec 13, 2021
    用自增 id ,但是 id 不暴露可以么? 暴露业务 id
    nigulasida
        26
    nigulasida  
       Dec 13, 2021
    @Numbcoder 换乘 PG ,为什么主键就不需要考虑这个问题了呢?
    可以用 uuid ?
    nigulasida
        27
    nigulasida  
       Dec 13, 2021
    @NBY

    换成 PG ,为什么主键就不需要考虑这个问题了呢?
    可以用 uuid ?
    elboble
        28
    elboble  
       Dec 13, 2021
    自增吧,mongo 要花力气才能做个自增的 id ,mysql 自带的还不用?
    Jooooooooo
        29
    Jooooooooo  
       Dec 13, 2021
    雪花是如此简单为啥不用呢.
    nekoneko
        30
    nekoneko  
       Dec 13, 2021
    id + uuid
    后端逻辑用 id
    前后端交互用 uuid
    0x208
        31
    0x208  
       Dec 13, 2021
    雪花目前用的挺舒服
    codespots
        32
    codespots  
       Dec 13, 2021
    @elboble 同意,用 MongoDB 的时候,一些场景比如用户 id 之类的,必须用类似自增 id 这样的 id ,就得费劲巴拉地区实现一个的时候,非常想念 mysql
    zoharSoul
        33
    zoharSoul  
       Dec 13, 2021
    @onhao #9 败的一塌糊涂 什么意思?
    Huelse
        34
    Huelse  
       Dec 13, 2021
    我们是主键自增 ID ,在系统内部关联查询等时也用这个 ID ,
    给用户等外部查询时是 hashid 或 uuid ,系统内部不会去用
    onhao
        35
    onhao  
       Dec 13, 2021
    @zoharSoul 盗版采集 直接根据 ID 来采集我们最新的作品。
    zhangyl
        36
    zhangyl  
       Dec 14, 2021
    雪花,或者自增
    雪花的话,如果和前端有交互,bigint 类型有失精问题(末尾几位会变成 0 ),可以改为字符串
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2307 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 123ms · UTC 00:32 · PVG 08:32 · LAX 17:32 · JFK 20:32
    ♥ Do have faith in what you're doing.