用 uuid 和自增作为主键,各有什么有缺点呢?

2018-10-19 11:16:54 +08:00
 hanshijun

萌新请教,大佬轻喷⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

9418 次点击
所在节点    数据库
38 条回复
qq976739120
2018-10-19 11:19:37 +08:00
单击就用自增吧,分布式有并发的话可以用雪花算法生成主键,也是现成的
lihongjie0209
2018-10-19 11:32:58 +08:00
uuid debug 的时候你就难受了
opengps
2018-10-19 11:41:49 +08:00
先随口说 2 点,~
自增 id 容易被猜解,爬虫,跨权限泄露数据比较容易
uuid 太长,并且有索引碎片,索引多占用空间的问题
robot777
2018-10-19 11:42:52 +08:00
那生产环境分布式数据库用什么方式好呢,自建一个生成自增 id 的分配服务吗
rogwan
2018-10-19 11:47:55 +08:00
一般应用自增足够,那点数据,规律还用猜吗?大数据 分布式按需使用,uuid 都有四五种。
zjp
2018-10-19 11:53:57 +08:00
MySQL 的主键不是递增 /减会有性能损失
单机下用雪花算法也不错,递增 & 没有明显规律
lastpass
2018-10-19 11:59:56 +08:00
自增 ID 方便排序,获取上 /下节点。而且一般自增 ID 都足够短。
mortonnex
2018-10-19 12:00:24 +08:00
@opengps 索引碎片是什么
qichengzx
2018-10-19 12:07:05 +08:00
顺势安利一波:Go 实现的高性能全局唯一序列号生成服务 https://github.com/qichengzx/seqsvr
思路来自:干货 | 分布式架构系统生成全局唯一序列号的一个思路 https://mp.weixin.qq.com/s/F7WTNeC3OUr76sZARtqRjw

求 star。
opengps
2018-10-19 12:35:54 +08:00
@mortonnex 索引碎片这个东西我理解也不是很透彻,你可以自行查询下,我可以确定的是 uuid 确实会有这个问题
rogwan
2018-10-19 12:44:06 +08:00
@mortonnex
@opengps
没有删除操作,应该不会产生索引碎片吧
acr0ss
2018-10-19 12:53:45 +08:00
自增方便有序;
uuid 高并发插入快
simonliu2018
2018-10-19 12:58:08 +08:00
自增主键(任何有序的序列)插入的时候索引块是连续的,一块写满再创建一块,这样效率显然是很高的。

如果用无序字段作为主键,索引块要经常分裂、合并(设想一堆无序的数字做插入排序),效率自然就差了。
simonliu2018
2018-10-19 12:59:00 +08:00
@acr0ss uuid 高并发插入快?原理是?
xuanbg
2018-10-19 13:08:56 +08:00
自增什么都好,就是有两点不好:
1、分表分库会有 ID 冲突,不分表分库就没有这个问题
2、外键是啥在主键入库前你不知道,需要插入后查询回来再赋值,这个有点别扭
kernel
2018-10-19 13:21:56 +08:00
@opengps 自增 id 和被爬是两回事,一个是对内 id,一个是对外,如果需防爬可以再建一列对外 id
nisekoi
2018-10-19 14:21:28 +08:00
自增 id 不单止容易被遍历,还容易暴露你的业务量,另外一点就是以后你数据量大了需要分库分表的时候会有问题
wps353
2018-10-19 14:32:09 +08:00
1、Innodb 是 B-Tree 结构存储,自增主键能很好的利用连续硬盘空间,uuid 很有可能导致随机 IO 影响效率。
2、Innodb 中的索引的叶子节点是包含主键的,一般 uuid 都比自增逐渐大,在索引占用空间上自增主键占优势。
wps353
2018-10-19 14:33:09 +08:00
@acr0ss 你确定并发 uuid 还快?
lihongjie0209
2018-10-19 14:53:45 +08:00
@wps353 会快一点, 因为 mysql 内部需要维护一个计数器, 并发访问一定会上锁保护的, 所以获取自增 id 会阻塞

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

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

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

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

© 2021 V2EX