UUID 做主键有什么优势和劣势?

2019-09-06 15:01:06 +08:00
 aaronysj

之前做过的项目,基本都是用自增 id 做主键或者没有主键。这次领导突然说用 UUID varchar(36)位做主键,让小弟有点迷惑,望大家指点迷津。

18147 次点击
所在节点    程序员
77 条回复
oma1989
2019-09-06 17:25:47 +08:00
UUID 数据量的大话会有吃屎的感觉,别问我咋知道的。。。。。。。
yalin
2019-09-06 17:33:00 +08:00
love
2019-09-06 17:38:35 +08:00
哪怕用 UUID 也不要 varchar(36) 啊,8 个二进制字节的事你搞这么大干嘛
wysnylc
2019-09-06 17:39:30 +08:00
@ryd994 #33 都说了大数据量,概率再低不是没有概率
我明确说明是大数据量就是防止你这种说概率低的抬杠,没想到你还是来了
tanszhe
2019-09-06 17:46:18 +08:00
直接搞个 id 生成服务, 和数据库自增一样的。
唯一缺点就是要单独部署一个服务
wenzhoou
2019-09-06 17:48:44 +08:00
分布式只能用 UUID 的情况。

假定我是一个公开的接口,有不特定的若干个客户端。
没个客户端给我们系统发送请求的时候,又需要这些请求记录都保存在 db 中。

这种需求就让客户端自己发 UUID 作为主键,你们随便发,保证不会冲突。

这是一种必须用 UUID 的场景。
W1angMh
2019-09-06 17:52:58 +08:00
建议用雪花算法
passerbytiny
2019-09-06 17:58:02 +08:00
@wysnylc #39 照你这“概率再低不是没有概率”的说法,下雨天就不能出门,遭雷劈的概率可要比 UUID 碰撞发生的概率高的多。抛开具体数字去说“大”,你这才是真正的抬杠。
wangliran1121
2019-09-06 18:10:33 +08:00
劣势很明显,不自增
wysnylc
2019-09-06 18:15:34 +08:00
@passerbytiny #48 爱抬你就多抬点,我当乐子看
swulling
2019-09-06 18:17:11 +08:00
uuid 碰撞和什么大数据量没关系

关键是两点,吞吐和生成 uuid 的机器
Takamine
2019-09-06 18:36:53 +08:00
我们是用的 PG 自带的 uuid 生成。_(:з」∠)_
weiruanniubi
2019-09-06 18:51:54 +08:00
求楼主头像的高清大图……
singworld
2019-09-06 21:01:53 +08:00
前公司代码规范里 禁止使用 uuid 做主键
Cbdy
2019-09-06 21:03:59 +08:00
优势是简单,劣势是性能差,而且差到在有的场景成为瓶颈
LokiSharp
2019-09-06 21:15:49 +08:00
各方面都有优势,劣势是总有人用字符串存他
wind3110991
2019-09-06 21:27:08 +08:00
如果是 INNODB 的话,索引结构是一颗 B+树,叶子节点存储的是索引的值,如果存递增的数字作为索引,那么无论是空间还是在一定范围内搜索都是高效的,如果存一段 UUID,真想不出有什么优势。
有人提到可以搞分布式+大数据量,但是 Mysql 本来就不是干这个事情的,如果是量级达到这个级别不如换成 HBase
lishunan246
2019-09-06 21:44:47 +08:00
靠 uuid 反爬根本就是掩耳盗铃。等把所有主键都换成 uuid,我想知道服务端一条日志能有多长。
itning
2019-09-06 22:44:28 +08:00
UUID 劣势是因为 mysql 索引是 B+树的结构导致的
iluckypig
2019-09-06 23:52:23 +08:00
你应该先补充一下索引结构的知识,就是到上面大家说的 UUID 索引性能差是为什么了

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

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

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

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

© 2021 V2EX