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

2024-08-20 17:22:34 +08:00
 win7pro

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

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

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

谢谢!

2593 次点击
所在节点    MySQL
16 条回复
TiggeYL
2024-08-20 17:28:32 +08:00
你这个不如用缓存,还能设置过期时间
sketcherly
2024-08-20 17:39:45 +08:00
主键不建议用 uuid 主要是插入页分裂的问题,据说插入性能急剧下降我(没有自己测过不过应该是真的),你个人的过这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引
当然,这种场景可以引入其他组件的话还是首选 redis
sketcherly
2024-08-20 17:41:59 +08:00
@sketcherly 错别字修正 我个人的话这种情况会考虑加一个自增主键啥也不干,然后 uuid 加唯一索引用来改查
Plutooo
2024-08-20 18:01:25 +08:00
首先删除表不一定会释放空间
其次你需要考虑使用 uuid 出现页分裂和 B+树空洞的问题
可以看看 mysql45 讲第 13 讲《为什么表数据删掉一半,表文件大小不变?》
aragakiyuii
2024-08-20 18:03:33 +08:00
uuid v7
win7pro
2024-08-20 18:14:39 +08:00
非常感谢!
june4
2024-08-20 19:28:04 +08:00
正常情况下,不断新增数据和删除旧日期的数据,完全不用担心表会越来越大,删掉的空间会被复用的
sardina
2024-08-20 19:49:44 +08:00
uuid v7: yes
julyclyde
2024-08-20 21:41:52 +08:00
你这几个其实都不该用 mysql……
Rocketer
2024-08-20 22:13:49 +08:00
你要是纠结 key 的问题还不如用 mongodb ,那个 key 算是完美的
huigeer
2024-08-20 22:17:15 +08:00
更重要的原因是页分裂造成的 io
newtype0092
2024-08-20 22:26:51 +08:00
你这两个数据场景的主键不应该是 uid 加时间么?使用 uuid 的目的是什么?
dddd1919
2024-08-20 22:53:21 +08:00
bigint 呗,也才 8k ,至少省一半空间,效率也好点。18446744073709551615 ,能把这撑爆?
dododada
2024-08-21 09:21:31 +08:00
1 楼的缓存吧,redis 就行
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 的根源所在。
Richared
2024-08-21 16:26:06 +08:00
uuid 的主要问题是大小无序叶分裂,但是其实问题不大,我们这现在有 70 多 w 数据 uuid 的表。没发现有啥异常。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1066506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX