您的位置:首页 > 数据库 > MySQL

Mysql笔记

2020-08-10 12:30 951 查看

next-key lock

select * from gap_table where num=6 for update

如果提交读使用

for update
。那么就没有gap锁,只有行锁,会出现幻读。
可重复读,不使用
for update
的情况下,永远读取的都是
TRX_ID
小于
TRX_ID_MIN
的快照,绝对不会出现幻读。
但是可重复使用了
for update
的情况下,会读取最新提交的事务快照。那就有问题出现,这样子不是会出现不可重复读吗?因此
for upadte
需要加锁。同时加上行锁和gap锁,结合起来就是
next-key lock
,它保证在可重复读使用
for update
的情况下,不会出现幻读的情况。

为什么Mysql官方推荐使用自增主键

mysql底层数据结构是 B+ 树,索引对应一棵 B+ 树,mysql 中的数据都是按顺序保存在 B+ 树上的(所以说索引本身是有序的)。
然后 mysql 在底层又是以数据页为单位来存储数据的,一个数据页大小默认为 16k,当然你也可以自定义大小,也就是说如果一个数据页存满了,mysql 就会去申请一个新的数据页来存储数据。

如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新的数据页接着写就可以了,无需任何的数据迁移

但是,如果使用非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都插入到某个现有数据页的位置上。
当往一个快满或已满的数据页中插入数据时,新插入的数据会将数据页写满
。因此mysql 就需要申请新的数据页,并且把上个数据页中的部分数据挪到新的数据页上,造成数据迁移

而这就是页分裂,这个大量移动数据的过程是会严重影响插入效率的。

非自增主键,基本都是随机的,因此效率存储效率会低的多。

但是为什么我们通常使用自定义主键,譬如雪花算法呢。原因
一:多线程竞争

二:多库多表时自增主键会非常痛苦。比如说将一种数据分为两张表放置,这两张表的共用一个逻辑主键。也就是,比如两张表都是放学生数据的,考虑到集群,需要分为两张表存放。其中一张表的主键为1、3、5····,另一张表为2、4、6···,两张表的主键是不能重复的。那么有可能把出现一张表一百万条数据,另一张表80万条,那么后续处理这两张表的数据时,就会变得非常非常麻烦。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: