
关于 mysql 主键,都说不建议用 uuid ,主要原因是耗费 16k 主键空间,怕容易撑爆。 但如果这个表只用于记录最新数据,定期删除老数据,比如:
1 、记录用户登录 session ,已经过期的 session 会定期删掉; 2 、记录自然日内的用户操作次数,比如用户发送短信验证码的次数,当天首次发验证码就产生一行数据用于记录当天发已经发送几次验证码,超额就拒绝发送,但到晚上 12 点就会清空这个表。
这两种情况下,是用 uuid 作为主键是否没啥问题?还是说还有我没想到的地方?
谢谢!
1 TiggeYL 2024-08-20 17:28:32 +08:00 你这个不如用缓存,还能设置过期时间 |
2 sketcherly 2024-08-20 17:39:45 +08:00 via Android 主键不建议用 uuid 主要是插入页分裂的问题,据说插入性能急剧下降我(没有自己测过不过应该是真的),你个人的过这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引 当然,这种场景可以引入其他组件的话还是首选 redis |
3 sketcherly 2024-08-20 17:41:59 +08:00 via Android @sketcherly 错别字修正 我个人的话这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引用来改查 |
4 Plutooo 2024-08-20 18:01:25 +08:00 首先删除表不一定会释放空间 其次你需要考虑使用 uuid 出现页分裂和 B+树空洞的问题 可以看看 mysql45 讲第 13 讲《为什么表据删掉一半,表文件大小不变?》 |
5 aragakiyuii 2024-08-20 18:03:33 +08:00 via Android uuid v7 |
6 win7pro OP 非常感谢! |
7 june4 2024-08-20 19:28:04 +08:00 正常情况下,不断新增数据和删除旧日期的数据,完全不用担心表会越来越大,删掉的空间会被复用的 |
8 sardina 2024-08-20 19:49:44 +08:00 uuid v7: yes |
9 julyclyde 2024-08-20 21:41:52 +08:00 你这几个其实都不该用 mysql…… |
10 Rocketer 2024-08-20 22:13:49 +08:00 via iPhone 你要是纠结 key 的问题还不如用 mongodb ,那个 key 算是完美的 |
11 huigeer 2024-08-20 22:17:15 +08:00 更重要的原因是页分裂造成的 io |
12 newtype0092/a> 2024-08-20 22:26:51 +08:00 你这两个数据场景的主键不应该是 uid 加时间么?使用 uuid 的目的是什么? |
13 dddd1919 2024-08-20 22:53:21 +08:00 bigint 呗,也才 8k ,至少省一半空间,效率也好点。18446744073709551615 ,能把这撑爆? |
14 dododada 2024-08-21 09:21:31 +08:00 1 楼的缓存吧,redis 就行 |
15 laminux29 2024-08-21 09:36:14 +08:00 内部业务主键,最好是用自增的 64 位 int ,也就是 BIGINT: https://dev.mysql.com/doc/refman/8.4/en/integer-types.html 有些场景需要把主键传到前端,产品经理不希望别人通过调试来看出主键值,于是还需要加个 hash 。而 UUID 可以在这里一步到位,这也是为啥很多公司喜欢 UUID 的根源所在。 |
16 Cruzz 2024-08-21 16:26:06 +08:00 uuid 的主要问题是大小无序叶分裂,但是其实问题不大,我们这现在有 70 多 w 数据 uuid 的表。没发现有啥异常。 |