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

mysql,如果数据会删除老数据,只保留最新数据,主键用 uuid 是否也 ok?

  •  
  •   win7pro · 27 天前 · 1817 次点击

    关于 mysql 主键,都说不建议用 uuid ,主要原因是耗费 16k 主键空间,怕容易撑爆。 但如果这个表只用于记录最新数据,定期删除老数据,比如:

    1 、记录用户登录 session ,已经过期的 session 会定期删掉; 2 、记录自然日内的用户操作次数,比如用户发送短信验证码的次数,当天首次发验证码就产生一行数据用于记录当天发已经发送几次验证码,超额就拒绝发送,但到晚上 12 点就会清空这个表。

    这两种情况下,是用 uuid 作为主键是否没啥问题?还是说还有我没想到的地方?

    谢谢!

    16 条回复    2024-08-21 16:26:06 +08:00
    TiggeYL
        1
    TiggeYL  
       27 天前   ❤️ 1
    你这个不如用缓存,还能设置过期时间
    sketcherly
        2
    sketcherly  
       27 天前 via Android   ❤️ 1
    主键不建议用 uuid 主要是插入页分裂的问题,据说插入性能急剧下降我(没有自己测过不过应该是真的),你个人的过这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引
    当然,这种场景可以引入其他组件的话还是首选 redis
    sketcherly
        3
    sketcherly  
       27 天前 via Android
    @sketcherly 错别字修正 我个人的话这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引用来改查
    Plutooo
        4
    Plutooo  
       27 天前
    首先删除表不一定会释放空间
    其次你需要考虑使用 uuid 出现页分裂和 B+树空洞的问题
    可以看看 mysql45 讲第 13 讲《为什么表数据删掉一半,表文件大小不变?》
    aragakiyuii
        5
    aragakiyuii  
       27 天前 via Android
    uuid v7
    win7pro
        6
    win7pro  
    OP
       27 天前
    非常感谢!
    june4
        7
    june4  
       27 天前
    正常情况下,不断新增数据和删除旧日期的数据,完全不用担心表会越来越大,删掉的空间会被复用的
    sardina
        8
    sardina  
       27 天前   ❤️ 2
    uuid v7: yes
    julyclyde
        9
    julyclyde  
       27 天前
    你这几个其实都不该用 mysql……
    Rocketer
        10
    Rocketer  
       27 天前 via iPhone
    你要是纠结 key 的问题还不如用 mongodb ,那个 key 算是完美的
    huigeer
        11
    huigeer  
       27 天前
    更重要的原因是页分裂造成的 io
    newtype0092
        12
    newtype0092  
       27 天前
    你这两个数据场景的主键不应该是 uid 加时间么?使用 uuid 的目的是什么?
    dddd1919
        13
    dddd1919  
       27 天前
    bigint 呗,也才 8k ,至少省一半空间,效率也好点。18446744073709551615 ,能把这撑爆?
    dododada
        14
    dododada  
       26 天前
    1 楼的缓存吧,redis 就行
    laminux29
        15
    laminux29  
       26 天前
    内部业务主键,最好是用自增的 64 位 int ,也就是 BIGINT:
    https://dev.mysql.com/doc/refman/8.4/en/integer-types.html

    有些场景需要把主键传到前端,产品经理不希望别人通过调试来看出主键值,于是还需要加个 hash 。而 UUID 可以在这里一步到位,这也是为啥很多公司喜欢 UUID 的根源所在。
    Richared
        16
    Richared  
       26 天前
    uuid 的主要问题是大小无序叶分裂,但是其实问题不大,我们这现在有 70 多 w 数据 uuid 的表。没发现有啥异常。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:19 · PVG 03:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.