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的主要内容,如果未能解决你的问题,请参考以下文章

python 内包表记

python リスト内包表记

html ¥·税込·税抜表记

html ¥·税込·税抜表记

html ¥·税込·税抜表记

python 快译通のリスト内包表记