V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
goodboy95
V2EX  ›  问与答

之前面试遇见一题,问我 MySQL 主键 ID 将要超过 bigint 上限的时候该怎么办

  •  
  •   goodboy95 · 2021-07-26 17:37:22 +08:00 · 3461 次点击
    这是一个创建于 998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    实际上面试官开始没说 bigint,只说超过上限,然后我随口问了一句“是不是连 bigint 都会超过上限?”,他说是。

    然后我就有点蒙了,bigint 往上好像找不到更大的整数变量了,用 string 的话性能基本不可接受。

    做分库分表的话,好像是可行,不过越想越麻烦,分出来的每个表主键 ID 需要从 1 重新开始计,这样的话感觉就需要考虑根据 ID 精准查询数据的情况,是不是需要另建一个 string 列用来存数据编号,分完表之后怎样做到新旧查询方式的无缝对接之类的,不过目前能想到的也只有这种方式了。

    不知道还有人能想到什么好方案吗?
    23 条回复    2021-07-27 09:18:48 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2021-07-26 17:41:27 +08:00   ❤️ 1
    bigint 都超了再改造呗, 一般不考虑这种问题

    其实是可以事先简单计算大概到了什么时候会超出 long 这种长度 (比如是 20 年后, 那现在就去考虑明显是过度设计

    通用性和实现难读肯定是需要取舍的
    leafre
        2
    leafre  
       2021-07-26 17:51:41 +08:00   ❤️ 1
    数据量乳齿大,就别往 MySQL 里塞了
    Maboroshii
        3
    Maboroshii  
       2021-07-26 17:52:27 +08:00
    提高上限!
    xiangyuecn
        4
    xiangyuecn  
       2021-07-26 17:55:50 +08:00   ❤️ 1
    年薪没一个亿 就不要耽误双方时间了🐶
    yor1g
        5
    yor1g  
       2021-07-26 18:09:59 +08:00
    bigint 不是 100 年都跑不满么
    lakehylia
        6
    lakehylia  
       2021-07-26 18:16:25 +08:00
    扩容改造呗
    soy
        7
    soy  
       2021-07-26 18:16:39 +08:00
    Key size 都有 2^63 * 8 = 73EB 了。这么大的数据量肯定不是 MySQL 该干的活了。BigTable 搞起!
    dqzcwxb
        8
    dqzcwxb  
       2021-07-26 18:19:06 +08:00   ❤️ 55
    bigint 最大数值 9223372036854775807,每秒 1 亿条数据量新增需要跑 2924 年
    这不是造火箭这么简单,这是奔着星际航行去,值得尊敬!
    sytnishizuiai
        9
    sytnishizuiai  
       2021-07-26 18:26:21 +08:00
    @dqzcwxb 牛逼
    luckyrayyy
        10
    luckyrayyy  
       2021-07-26 18:29:25 +08:00
    他是想问分库分表吗
    chenset
        11
    chenset  
       2021-07-26 18:58:25 +08:00
    @dqzcwxb 牛逼
    fkdtz
        12
    fkdtz  
       2021-07-26 19:16:20 +08:00
    @dqzcwxb 哈哈哈,我开始好奇是哪家公司了
    iceheart
        13
    iceheart  
       2021-07-26 19:38:24 +08:00 via Android   ❤️ 1
    这问题,当你想解决方案的时候你就错了
    kekxv
        14
    kekxv  
       2021-07-26 19:45:47 +08:00 via iPhone   ❤️ 7
    使用两个 bigint 联合约束作为主键,他要是还说超了,那可以回他:我感觉我现在还不配做那么大的项目🐶
    hst001
        15
    hst001  
       2021-07-26 21:09:33 +08:00 via Android
    能把 bigint 用满的公司可能还是头一次见
    gstqc
        16
    gstqc  
       2021-07-26 22:40:56 +08:00 via Android
    哈哈哈,上次有个兄弟问怎么把 C(400,1000)的所有组合数在 10 秒内打印出来
    数据量比这个还大 n 倍
    akira
        17
    akira  
       2021-07-26 23:11:21 +08:00   ❤️ 1
    考察的重点应该不是 bigint 了啦 ,不要扣字眼去了
    hushao
        18
    hushao  
       2021-07-26 23:40:50 +08:00   ❤️ 1
    @goodboy95 抖个机灵,你应该先弱弱的问下他,贵司主键 ID 是不是从 bigint 上限-1 开始自增的能用完[逃~]
    yhxx
        19
    yhxx  
       2021-07-26 23:53:09 +08:00
    第一反应是淘宝订单号那个溢出问题
    然后,bigint ???
    他是要用来存 ipv6 的吗?
    nuistzhou
        20
    nuistzhou  
       2021-07-27 00:18:43 +08:00 via iPhone   ❤️ 1
    你随口一问是不是会超过 bigint 上限,估摸着他也没算,随口一答罢了。你应该直接跟他算账的,哈哈
    GeruzoniAnsasu
        21
    GeruzoniAnsasu  
       2021-07-27 01:17:40 +08:00   ❤️ 2
    经典面试题了,以这个问题开头的就是想问分库分表,估计面试官也是从别人那学来的,但光记了个问题自己也没搞透。

    面试者问 “是不是连 bigint 都会超过上限” ,面试官应该答 “你可以先考虑考虑”,然后继续正常问题流,他这「是」把自己也绕进去了,如果强势一点应该立即反问 “能举个这样的业务场景例子” 才对
    duange7X24
        22
    duange7X24  
       2021-07-27 08:46:41 +08:00   ❤️ 1
    直接反问,能举个这样的场景吗?贵公司是否有?一般肯定会回答有(如果没有那考虑个 P 啊),然后直接撂下一句话别装 x 了,来之前我就了解了贵公司....
    starcraft
        23
    starcraft  
       2021-07-27 09:18:48 +08:00   ❤️ 1
    让他说公司是不是有这个业务场景,自己入职是不是要处理这些。说不出来,就甩他个屁股走人,真是浪费时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1470 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:14 · PVG 01:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.