分布式数据库30讲
王磊
光大银行首席数据架构师
新⼈⾸单¥19.9
2295 人已学习
课程目录
已更新 18 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|为什么要学习分布式数据库?
免费
基础篇 (8讲)
01|什么是分布式数据库?
02|强一致性:那么多数据一致性模型,究竟有啥不一样?
03|强一致性:别再用BASE做借口,来看看什么是真正的事务一致性
04 | 架构风格:NewSQL和PGXC到底有啥不一样?
05 | 全局时钟:物理时钟和逻辑时钟你Pick谁?
06 | 分片机制:为什么说Range是更好的分片策略?
07 | 数据复制:为什么有时候Paxos不是最佳选择?
08 | 基础篇大串讲:重难点回顾+思考题答疑+知识全景图
开发篇 (9讲)
09|原子性:2PC还是原子性协议的王者吗?
10 | 原子性:如何打破事务高延迟的魔咒?
11|隔离性:读写冲突时,快照是最好的办法吗?
12 | 隔离性:看不见的读写冲突,要怎么处理?
13 | 隔离性:为什么使用乐观协议的分布式数据库越来越少?
14 | 隔离性:实现悲观协议,除了锁还有别的办法吗?
15 | 分布式事务串讲:重难点回顾+思考题答疑+知识全景图
16 | 为什么不建议你使用存储过程?
17 | 为什么不建议你使用自增主键?
分布式数据库30讲
15
15
1.0x
00:00/00:00
登录|注册

17 | 为什么不建议你使用自增主键?

王磊 2020-09-16
你好,我是王磊,你也可以叫我 Ivan。
有经验的数据库开发人员一定知道,数据库除了事务处理、查询引擎这些核心功能外,还会提供一些小特性。它们看上去不起眼,却对简化开发工作很有帮助。
不过,这些特性的设计往往是以单体数据库架构和适度的并发压力为前提的。随着业务规模扩大,在真正的海量并发下,这些特性就可能被削弱或者失效。在分布式架构下,是否要延续这些特性也存在不确定性,我们今天要聊的自增主键就是这样的小特性。
虽然,我对自增主键的态度和第 16 讲提到的存储过程一样,都不推荐你使用,但是原因各有不同。存储过程主要是工程方面的原因,而自增主键则是架构上的因素。好了,让我们进入正题吧。

自增主键的特性

自增主键在不同的数据库中的存在形式稍有差异。在 MySQL 中,你可以在建表时直接通过关键字 auto_increment 来定义自增主键,例如这样:
create tabletest’ (
idint(16) NOT NULL AUTO_INCREMENT,
namechar(10) DEFAULT NULL,
PRIMARY KEY(‘id’)
) ENGINE = InnoDB;
而在 Oracle 中则是先声明一个连续的序列,也就是 sequence,而后在 insert 语句中可以直接引用 sequence,例如下面这样:
create sequence test_seq increment by 1 start with 1;
insert into test(id, name) values(test_seq.nextval, ' An example ');
自增主键给开发人员提供了很大的便利。因为,主键必须要保证唯一,而且多数设计规范都会要求,主键不要带有业务属性,所以如果数据库没有内置这个特性,应用开发人员就必须自己设计一套主键的生成逻辑。数据库原生提供的自增主键免去了这些工作量,而且似乎还能满足开发人员的更多的期待。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式数据库30讲》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(4)

  • Jxin
    课后题
    1.第一次听说尾部热点,长见识。
    2.不好说一定能避免出现“热点”。首先,随机主键替换自增主键,确实能分散写入热点。但如果这个写入"热点"超过db分配集群的容量,那么再怎么分散也没有意义。其次,既然是随机,那么脸也很重要,非酋手全落到一个rang分片内,那么热点还是会出现。

    个人疑问:
    对于db的单机性能瓶颈,到底是自增主键先到还是db连接数(并行任务数)先到呢?从栏主的描述,感觉是自增主键会先到。(从自增主键的产生环节的描述来看)
    2020-09-16
    2
  • 平风造雨
    随机主键的如果是64位的Long,再使用Range分区的情况下,某段时间内某个分区依然还是热点吧?
    2020-09-16
  • 游弋云端
    个人认为自增主键本身在单体数据库中不是一个良好的设计,应该定义自己的主键或者流水号规则。分布式系统中,需要一个流水号分配中心,类似于Oracle的解决方案,分配一个号段先持久化,然后对外发放,异常后+X来避免重复分配,保障流水号唯一。
    2020-09-16
  • 左岸
    所以结论就是分布式下,做到全局唯一和趋势递增更简单,不要想着单调递增?
    2020-09-16
收起评论
4
返回
顶部