MySQL技术内幕(InnoDB存储引擎)
2020-09-01 本文已影响0人
Aplha
MySQL(InnoDB存储引擎)
文件
参数文件
-
作用:配置参数文件,指定初始化参数和指定数据库各种文件所在位置
-
参数类型
- 动态参数:MySQL运行时修改,下次启动失效(不修改参数文件,下次启动读取配置文件)
- 静态参数:整个生命周期不可修改
日志文件
-
错误日志(error log)
- 记录MySQL启动/运行/关闭过程中错误/警告/正确信息
-
二进制日志(binlog)
-
记录对MySQL执行更改的所有操作,即使更改操作本身没有导致数据库变化
-
作用
- 恢复:point-in-time级别的数据恢复
- 复制:主从数据库实时同步
- 审计:判断是否有注入攻击
-
-
慢查询日志(slow query log)
- 记录执行时间超过阈值(默认10秒)的sql语句
- 记录不使用索引的sql语句
- 记录超过指定逻辑IO次数的sql语句
-
查询日志(log)
- 记录所有对MySQL请求的信息,无论请求是否得到正确响应
表结构定义文件
- 记录表结构定义
InnoDB存储引擎文件
-
表空间文件
- 存储数据按表空间进行存放
-
重做日志文件(redo log)
-
记录对于InnoDB存储引擎的事务日志
-
redo log与binlog区别
- binlog记录所有MySQL有关的更新日志,redo log只记录有关存储引擎本身的事务日志
- binlog记录的是逻辑日志(一行),redo log记录的是关于每页更改的物理情况
- binlog在事务提交完成后一次写入.事务进行过程中,不断有重做日志写入redo log
-
索引
B+树索引
-
注:B+树索引并不能找到一个给定键值的具体行,B+树索引能找到的只是被查找数据行所在的页,然后数据库把页读入到内存,再在内存中查找
-
数据库B+树高度一般24层,最多24次IO
-
数据结构与算法
-
多路查找树
- 每个结点的孩子数可以多余两个
- 每个结点可以存储多个元素
-
B树
- 平衡的多路查找树
- 结点最大的孩子数目称为B树的阶
-
B+树
- 任何非叶子结点都会在叶子结点再次出现一次
- 叶子结点通过双向指针连接
- 插入或删除通过拆页和旋转维持平衡
-
B树与B+树区别
- B树优点在于数据存储在每个结点,可以更快访问到,应用在文件系统
- B+树在每个非叶子结点只充当索引,查询必须到叶子结点结束,适合扫库和区间查询
- B+树查找元素时,即使在叶子结点找到目标值,还需继续找到它在叶子结点的位置
-
-
类型
-
聚集索引
-
定义:按照每张表的主键构建的B+树,叶子结点存储整张表的行记录数据,每个数据页通过一个双向链表连接,每张表只有一个聚集索引
-
特点
- 查询优化器优先使用聚集索引,因为在叶子结点可以直接找到数据
- 对于主键的排序查询和范围查询速度非常快
- 叶子结点存放完整的行记录,非叶子结点存放键值及指向数据页的偏移量
-
-
辅助索引(非聚集索引)
- 定义:叶子结点不包含行记录数据,叶子结点除键值外,还保存一个书签(相应行数据的聚集索引键),每张表可以有多个辅助索引
-
-
B+树索引使用
-
联合索引
- 定义:对表多个列进行索引,也是一棵B+数,结点存储键值数量大于等于2
- 对第二个键值进行了排序处理
-
覆盖索引
- 定义:从辅助索引可查询的记录,不需查询聚集索引的记录,辅助索引叶子节点不包含行记录数据,大小远小于聚集索引,可减少大量IO操作
- 查询字段为主键
- 某些统计问题(统计数量)
-
哈希索引
- 自适应哈希索引,只能用来搜索等值的查询
全文检索
- 定义:将存储于数据库中的整本书或整篇文章中的任意内容信息查找出来的技术
- 实现:倒排索引(在辅助表中存储单词和单词自身在一个或多个文档中所在位置之间的映射)
事务
ACID
- 原子性
- 一致性:事务回滚使数据库状态保持一致
- 隔离性:每个读写事务的对象对于其他事务的操作对象相互隔离,即事务提交前对其他事务都不可见
- 持久性:事务一旦提交,结果是永久的
redo
- 物理日志,记录页的物理修改操作
- 保证事务持久性
- 顺序写,数据库运行时不需要对redo log进行读取操作
- 恢复速度比逻辑日志快的多
undo
- 逻辑日志,事务回滚用到
- 实现MVCC:读取一条记录,若该记录被其他事务占用,可通过undo读取之前的行版本信息
事务隔离级别
- Read UnCommitted
- Read Committed
- Repeatable Read(InnoDB默认)
- Serializable
锁
术语
-
共享锁(S):允许事务读一行数据
-
排他锁(X):允许事务更新或删除一行数据
-
InnoDB意向锁(表级别):对最细粒度的对象上锁,首先需对粗粒度的对象上锁
- 意向共享锁(IS):事务想要获得一张表中某几行的共享锁
- 意向排他锁(IX):事务想要获得一张表中某几行的排他锁
一致性非锁定读
- InnoDB通过多版本控制的方式读取当前执行时间数据库中行数据,若读取的行正在进行DELETE或UPDATE操作,这时读取操作不会等待锁的释放,InnoDB会去读取行的一个快照数据
- 一个行记录可以有不止一个快照数据,这个技术称为MVCC(多版本并发控制)
- Read Committed事务隔离级别下,读取被锁定行的最新一份快照数据
- Repeatable Read事务隔离级别下,读取事务开始时的行数据版本
一致性锁定读
-
InnoDB支持两种一致性锁定读操作
- SELECT…FOR UPDATE(加X锁)
- SELECT…LOCK IN SHARE MODE(加S锁)
锁问题
-
脏读
- 脏页:在缓冲池中已经被修改的页还没刷新到磁盘
- 脏数据:事务对缓冲池中行记录的修改,还没有被提交
- 发生条件需要在事务隔离级别为Read UnCommitted
-
不可重复读
- 在一个事务内多次读取同一数据集合,读到的数据可能不一致(其他事务将该数据集合更新)
- 脏读读到的是未提交的数据,不可重复读读到的是已提交的数据
-
发生条件需要在事务隔离级别为Read Committed
MySQL(InnoDB存储引擎).png