draveness / blog-comments

面向信仰编程
https://draveness.me
140 stars 6 forks source link

为什么 MySQL 的 自增主键不单调也不连续 - 面向信仰编程 · /whys-the-design-mysql-auto-increment #198

Closed draveness closed 2 years ago

draveness commented 4 years ago

https://draveness.me/whys-the-design-mysql-auto-increment/

xiaoyuzdy commented 4 years ago

老哥看了你很多的文章,干货挺多的,不知道你现在在哪家公司主要做什么方向的工作?

draveness commented 4 years ago

老哥看了你很多的文章,干货挺多的,不知道你现在在哪家公司主要做什么方向的工作?

做 Kubernetes 相关的事情

xiao7737 commented 4 years ago

对于批量插入的语句,MySQL有一个批量申请自增ID的策略,第一次申请1个,1个用完了,第二次申请2个,依次倍增,每次申请的ID的个数是上一次申请的两倍,在这里有可能会出现浪费的自增ID,导致出现不连续的情况

draveness commented 4 years ago

对于批量插入的语句,MySQL有一个批量申请自增ID的策略,第一次申请1个,1个用完了,第二次申请2个,依次倍增,每次申请的ID的个数是上一次申请的两倍,在这里有可能会出现浪费的自增ID,导致出现不连续的情况

这个确实也是一个原因,如果有时间的话,我来做个补充

lycheng commented 4 years ago

有个问题想问下,关于图 3 - 5.7 版本之前的 AUTO_INCMRENT

那图上半部的意思是更新 executions 之后也会影响 trades 表的 AUTO_INCMRENT 的?

draveness commented 4 years ago

有个问题想问下,关于图 3 - 5.7 版本之前的 AUTO_INCMRENT

那图上半部的意思是更新 executions 之后也会影响 trades 表的 AUTO_INCMRENT 的?

不是,这里的意思是 executions 表中的记录引用了 trades 表中 id 为 10 的记录,但是随后 trades 表中的记录被删除了,我们使用相同的 id 创建了新的记录,executions 表完全不知道,它以为自己引用的还是过去的记录

lycheng commented 4 years ago

@draveness

有个问题想问下,关于图 3 - 5.7 版本之前的 AUTO_INCMRENT

那图上半部的意思是更新 executions 之后也会影响 trades 表的 AUTO_INCMRENT 的?

不是,这里的意思是 executions 表中的记录引用了 trades 表中 id 为 10 的记录,但是随后 trades 表中的记录被删除了,我们使用相同的 id 创建了新的记录,executions 表完全不知道,它以为自己引用的还是过去的记录

明白,我看有点困惑是第一行的 10 我看成是 insert 之后的结果,谢谢

malcolmjerry commented 4 years ago

@draveness

老哥看了你很多的文章,干货挺多的,不知道你现在在哪家公司主要做什么方向的工作?

做 Kubernetes 相关的事情

那要出個 K8S 的文章 ~

puzzle9 commented 4 years ago

有趣的概念 不过确实是存在的

fkpwolf commented 4 years ago

主键连续的意义在哪里?充分利用防止用完?

konkona commented 3 years ago

@fkpwolf 主键连续的意义在哪里?充分利用防止用完?

连续的key可以保证b+树写索引的时候尽量顺序写,不会导致page页面分裂

Gilfoyle7 commented 3 years ago

图3-5.7最后一行弄错了吗?AUTO_INCREMENT应该还是10才对吧,第一行插入的时候不也是10吗

draveness commented 3 years ago

@Gilfoyle7 图3-5.7最后一行弄错了吗?AUTO_INCREMENT应该还是10才对吧,第一行插入的时候不也是10吗

这里没问题,AUTO_INCREMENT 是插入后的值

Gilfoyle7 commented 3 years ago

@draveness

@Gilfoyle7 图3-5.7最后一行弄错了吗?AUTO_INCREMENT应该还是10才对吧,第一行插入的时候不也是10吗

这里没问题,AUTO_INCREMENT 是插入后的值

那意思是UPDATE操作也会改变AUTO_INCREMENT的值吗?怎么第二行变成11了,是我理解哪里理解错了吗?麻烦前辈解惑一下

allanruin commented 3 years ago

图3完全看不懂。。

ArayChou commented 3 years ago

"交叉模式 innodb_autoinc_lock_mode = 2; 所有的插入语句都不需要获取表级别的 AUTO_INCREMENT 锁,但是当多个语句插入的数据行数不确定时,可能存在分配相同主键的风险;"

和官方文档说法不一致,文档里貌似没有说有“分配相同主键”的风险 https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html