第5章 索引与算法
5.1 InnoDB存储引擎索引概述
索引类型:
• B+树索引
• 全文索引
• 哈希索引
B+树索引时最为常用和最为有效的索引,
B+树索引并不能查找一个给定键值的具体行
查找流程:
查找数据所在的页->将页读入内存->在内存中查找数据
B+树的层数一般是2-4层,查找键值只要2-4次IO操作,查询时间只需0.02~0.04秒
5.4.1 聚集索引
聚集索引(clustered index) 就是按照每张表的主键构造一棵B+树, 同时叶子节点中存放的即为整张表的行记录数据, 也将聚集索引的叶子节点称为数据页
聚集索引的存储并不是物理上连续的, 而是逻辑上连续的
5.4.2 辅助索引
5.7.2 InnoDB存储引擎中的哈希算法
冲突机制:采用链表方式
哈希函数:除法散列
h(k)=k mod m
m的取值为略大于2倍的缓冲池页数量的质数
第6章 锁
数据库系统区别于文件系统的一个关键特性
6.1 什么是锁
用途:对共享资源的并发访问,提供数据的完整性和一致性
在行级别上对表数据上锁
6.2 lock与latch
Latch 闩锁,轻量级的锁 锁定时间非常短 操作对象是线程
Lock 操作对象是事务
屏幕剪辑的捕获时间: 2017/8/24 16:46
6.3 InnoDB存储引擎中的锁
6.3.1 锁的类型
• 共享锁[S Lock]:允许事务读一行数据
• 排它锁 [X Lock]:允许事务删除或更新一行数据
多粒度锁:允许事务在行级上的锁和表级上的锁同时存在
两种意向锁:
1) 意向共享锁(IS Lock) , 事务想要获得一张表中某几行的共享锁
2) 意向排他锁(IX Lock) , 事务想要获得一张表中某几行的排他锁
6.3.2 一致性非锁定读
6.3.4 自增长与锁
6.5 锁问题
锁会带来三种问题:脏读,不可重复读,丢失更新
6.5.1 脏读
重要概念区分
脏页:在缓冲池中已经修改的页,但是还未刷新到磁盘中。不影响数据的一致性,提高性能
脏数据:事务对缓冲池中行记录的修改,还没有被提交commit。
读到脏数据,即一个事务可以读到另外一个事务中未提交的数据。违反事务的隔离性
6.5.2 不可重复读
不可重复读:在同一个事务中读取同一条记录多次次,得到的结果不一致,由于在2次读取之间另外一个事务对此行数据进行了修改。
违反一致性
不可重复读的问题定义为Phantom Problem
InnoDB存储引擎的默认事务隔离级别是READ REPEATABLE, 采用Next-Key Lock算法, 避免了不可重复读的现象
6.5.3 丢失更新
一个事务的更新操作会被另一个事务的更新操作所覆盖, 从而导致数据的不一致。
解决办法:串行化操作,加X锁
6.6 阻塞
一个事务中的锁等待另一个事务的锁释放它所占的资源
6.7 死锁
死锁是指两个或两个以上的事务在执行过程中, 因争夺锁资源而造成的一种互相等待的现象
解决办法:等待转换为回滚,并且事务重新开始
最简单的一种方法:超时—-超过时间阈值回滚,另一个事务执行。
普遍的方式:等待图wait-for graph 【InnoDB存储采用 】
要求保存两种信息:锁的信息链表,事务等待链表。
死锁后回滚undo量最小的事务。
死锁只存在于并发的情况。