数据页-4k一页
InnoDB
插入时自动根据主键排序
链表结构,
查询慢,解决方案是建一个页目录(b+树)
如果数据一页存不下,会存在多页里,于是就需要目录页来指定数据在那一页。
创建表时会创建一个页(第一页),当数据多到一页放不下时,复制第一页,创建第二页,将原来第一页改为目录页(保证起始页恒定),将新第一页和第二页挂到目录页下。
事务版本链表(undolog)
mysql会给每行数据加上隐藏字段row_id(表没有主键id时),trx_id, roll_pointer
当事务修改某一行数据时,会复制该行数据,并将复制行的trx_id设置为当前事务id,roll_pointer指针指向原数据行
对于当前事务可以根据trx_id查询出已修改的值
对于其它事务或者其它session,如何查询出正确(最新)数据?
其它session在查询时,mysql会提供包含活跃事务(未提交)id的数组(m_ids),然后当前查询会查找trx_id不在m_ids中的最新一条数据,就是该行数据的最新数据。
活跃事务数组(m_ids)复用第一次生成的,并不会因为其它事务提交而改变。
select不会与锁冲突,就算这行数据加了读写锁,也不会影响select语句
其它session可读不可写
其它session不可读写
读已提交事务隔离级别,只锁查询出来的行,可插入相关数据
可重复读事务隔离级别,where索引,只锁查询出来的行,where非索引,锁所有行,不可插入相关数据