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万条,那么后续处理这两张表的数据时,就会变得非常非常麻烦。
相关文章推荐
- MySQL 使用笔记
- 【慕课笔记】1-5 初涉MYSQL—修改MYSQL提示符
- JDBC笔记1——java和mysql连接
- MySQL教程学习笔记
- MySQL听课笔记(1)
- 毕设笔记--MyEclipse10与MySQL建立数据库连接
- MySQL 数据库设计复习笔记及项目实战
- (mysql笔记)添加用户、删除用户与授权
- Mybatis学习笔记01 -- Mybatis简单操作数据库Mysql
- Mysql笔记
- 63.笔记 MySQL学习——时态值
- MySQL自学笔记2--select的5个子句
- 【慕课笔记】PHP与MySQL关系大揭秘
- MySQL日志笔记
- centos 7 mysqlhotcopy 安装,使用 笔记
- MySQL 学习笔记 二
- MySQL笔记-mysql用户管理
- MySQL语法大全_自己整理的学习笔记
- MySQL学习笔记 约束以及修改数据表
- day13_Mysql事务与数据库连接池学习笔记