insertRecoed
Posted 看写写
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了insertRecoed相关的知识,希望对你有一定的参考价值。
插入一条语句
逻辑sql语句
insert into t SELECT 100,100,100,100;
逻辑上记录
逻辑上记录是线性存储,其顺序按照主键的大小进行顺序存储。
隔离性
新增的记录在 REPEATABLE READ 隔离级别下是无法看到的。
但是在 read Commit隔离级别下,是可以看到的。
数据库锁
只要是对表记录的修改,会自动一个添加一个事务,即使不显示的声明,mysql 也会给你加上一个事务
所以insert 语句自动加锁, 如果这个时候有人执行了 select for update 操作,或者修改操作导致
范围加锁则会导致 insert 语句插入等待,默认10s内获取不到锁则抛出异常。
物理
double write
数据缓存先进入double weite,再写入相应的数据页
ibddata1
新增一个B+数索引,主键索引, 其叶子节点指向 t.bit中的数据页
主键a是一个聚餐索引其叶子节点是数据页
唯一索引uq 和 普通索引 normal_key 都是辅助索引,也是B+数索引,但是其叶子节点指向
主键索引的键值,
t.bid
在双向链表中,新增一条数据记录.如果空闲链表有合适的空闲节点则复用空闲节点,所以物理上
是不连续的,由于链表存储肯定存在空间碎片的问题,所以最好的方法就是不删除记录。
redolog
重做日志包含,插入的数据记录、插入的索引
undolog
插入记录相对其他记录来说是比较简单的,因为默认隔离性是 REPeated 索引事务结束之后是可以
直接删除的,修改和删除语句就算事务结束了,由于MVCC的存在,也是不能擅长的,否则就违反了
隔离性了。
对应的反向操作 ,删除语句,是逻辑语句,最终只是先标记不会直接删除
delete from table t where a = 100;
重做日志
binlog
就是insert 语句,这里就不再列出了,太长了,大家可以使用
mysqlbinlog -vv binlog.000004 语句去观察,但是需要注意的是 binglog
有三种不同的记录方式,statement、row、mixed,其内容是不一样的。
总结
插入记录主要是使用各种缓存技术来提供其新能,减少磁盘IO的次数,但是随着数据里了
上面索引越多,特别是唯一索引是很消耗的IO的,因为唯一索引不能缓存,必须进行一次
写确认其唯一性,但是普通的索引就可以使用缓存技术,直接在内存写索引,最后更新到磁盘。
以上是关于insertRecoed的主要内容,如果未能解决你的问题,请参考以下文章