Skip to content

Latest commit

 

History

History
59 lines (29 loc) · 1.72 KB

README.md

File metadata and controls

59 lines (29 loc) · 1.72 KB

mysql

数据页-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非索引,锁所有行,不可插入相关数据