MySQL存储引擎
最小单位一个 Page(16KB)
页头(记录页面的控制信息,共56字节),包括页的左右兄弟页面指针,页面空间使用情况等。
虚记录(最大虚记录,最小虚记录)
记录堆
自由空间链表
未分配空间
页尾
页内记录维护(顺序保证,插入策略,页内查询)
顺序保证:物理有序,逻辑有序(推荐选择,可以优化读)
一个索引树,连接每个逻辑有序的页,通过链表连接所有兄弟页。
插入策略:自由空间链表(优先),未使用空间
页内查询:遍历,二分查找(优先)
InnnoDB内存管理
预分配内存空间,数据加载单元,数据内外存交换
Buffer Pool(预分配的内存池),Page(Buffer Pool的最小单位),Free list(空闲Page组成的链表),Page hash表(维护内存Page和文件Page的映射关系),LRU(内存淘汰算法)
LRU:将热数据装在到表头,最冷的数据装在到表尾
LRU_new,LRU_old,Midpoint,做冷热数据分离。
页面装载:磁盘数据到内存,Free list中取>LRU中淘汰>Flush LRU淘汰
页面淘汰:LRU尾部淘汰,Flush LRU淘汰
页面移动:
old到new:innodb_old_blocks_time,old区存活时间大于此值有机会进入new区。
new到old:因为Midpoin指向5/8位置,
LRU_new的操作:减少大家竞争锁Lock的次数,减少移动次数(1.free_page_clock:Buffer Pool淘汰页数,2.LRU_new长度1/4)
MySQL事务基本概念
事务特性(ACID,AID必然C),并发问题,隔离级别
并发问题:脏读(督导未提交的数据),不可重复读(两次读取结果不同),幻读(select 操作得到的结果所表征的数据状态无法支撑后续的业务操作)
隔离级别:读未提交(会造成脏读),读已提交(会造成不可重复读),可重复读(会造成幻读),串行化
事务实现原理
MVCC(多版本并发控制):当前读,快照读。可见性判断(创建快照这一刻还未提交的事务,创建快照之后创建的事务,这两都可见),Read View(快照读 活跃事务列表,列表中最小事务ID,列表中最大事务ID)
undo log(回滚日志):保证事务原子性,实现数据多版本,delete undo log(用于回滚,提交即清理),update undo log(用于回滚)
redolog:记录修改,用于异常恢复,循环写文件(Write Pos写入位置,Check Point刷盘位置,Check Point>Write Pos落盘),刷盘时机innodb_flush_log_at_trx_commit
InnoDB锁类型
锁粒度(行级锁,间隙锁,表级锁)
所有当前读要加排他锁,SELECT,FOR UPDATE,UPDATE,DELETE
行级锁:作用在索引上,聚簇索引&二级索引
间隙锁:解决可重复读模式下的幻读问题,GAP锁锁住的位置是两条记录之间的GAP
表级锁:lock tables,元数据锁DML