mysql进阶笔记 InnoDB (一)InnoDB存储引擎

本文是MySQL InnoDB存储引擎的进阶笔记,介绍了InnoDB体系架构,包括后台线程和内存管理;阐述了Checkpoint技术及其作用、分类;说明了Master Thread工作方式;还讲解了InnoDB关键特性,如插入缓冲、两次写、自适应哈希索引等,提升数据库性能和可靠性。

mysql进阶笔记 InnoDB (一)InnoDB存储引擎

InnoDB体系架构

在这里插入图片描述
1.内存池:维护进程/线程访问的数据结构 缓存磁盘文件 重做日志缓冲
2.后台线程:保证内存缓存的是最新的数据 刷新到磁盘文件 保证能恢复正常

后台线程

1.Master Thread: 将缓冲池数据刷新到磁盘等等。
2.IO Thread: 负责异步IO请求的回调(call back)处理 。
3.Purge Thread: 回收已经使用并分配的undo页。
4.Page Cleaner Thread:脏页刷新。

内存

1.缓冲池
在这里插入图片描述

2.LRU List、Free List和Flush List
采用改进的LRU算法进行内存管理,即将最频繁的页放到缓存列表的中间位置
3.重做日志缓冲
InnoDB存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。

Checkpoint技术

当事务提交时,先写重做日志,再修改页。当由于发生宕机而导致数据丢失时,通过重做日志来完成数据的恢复。
要解决的问题:
1.缩短数据库的恢复时间 -> 数据库只需对Checkpoint后的重做日志进行恢复。
2.缓冲池不够用时,将脏页刷新到磁盘 -> 缓冲池不够用时,根据LRU算法会溢出最近最少使用的页
3.重做日志不可用时,刷新脏页 ->

分类:
1.Sharp Checkpoint: 数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式
2.Fuzzy Checkpoint: 只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

Master Thread工作方式

InnoDB关键特性

插入缓冲(Insert Buffer)
  1. insert buffer
    插入缓存是存储在磁盘中的。
    问题:在进行索引的插入时,对于聚集索引来说插入操作是按主键进行顺序插入的,所以不需要用到磁盘的随机读取;但是对于辅助索引来说,插入操作不再是顺序插入了,所以耗时较长。
    InnoDB解决方法:InnoDB存储引擎开创性地设计了Insert Buffer,对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中,然后再以一定的频率和情况进行Insert Buffer和辅助索引页子节点的merge(合并)操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。
    需要满足条件:a.索引是辅助索引 -> 聚集索引不需要此操作
    b.索引是唯一的 -> 判断唯一性也需要用随机读取
    2.change buffer
    InnoDB 1.0.x版本开始引入
    支持对insert、delete、update都进行缓冲。

3.内部实现
Insert Buffer是一棵B+树,因此其也由叶节点和非叶节点组成。非叶节点存放的是查询的search key(键值)

两次写(Double Write)

oublewrite(两次写)为InnoDB存储引擎提供数据页的可靠性。
doublewrite由两部分组成,一部分是内存中的doublewrite buffer,大小为2MB,另一部分是物理磁盘上共享表空间中连续的128个页,即2个区(extent),大小同样为2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中,此时的写入则是离散的。

自适应哈希索引(Adaptive Hash Index)异步IO(Async IO)刷新邻接页(Flush Neighbor Page)
  1. InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。
  2. 用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。
  3. 当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个IO写入操作合并为一个IO操作,故该工作机制在传统机械磁盘下有着显著的优势。
### 黑马程序员 MySQL 进阶学习笔记与资料 #### SQL优化方法 在简历中提到SQL优化时,仅提及“加索引”可能并不全面。实际上,SQL优化是个复杂的主题,涉及多个方面。例如,在SQL语句中可以使用提示(Hints)来指导数据库如何执行查询[^2]。常见的提示包括`USE INDEX`、`IGNORE INDEX`和`FORCE INDEX`,它们分别用于建议、忽略或强制使用某个索引。 ```sql -- 建议使用 idx_user_pro 索引 EXPLAIN SELECT * FROM tb_user USE INDEX(idx_user_pro) WHERE profession = '软件工程'; -- 忽略 idx_user_pro 索引 EXPLAIN SELECT * FROM tb_user IGNORE INDEX(idx_user_pro) WHERE profession = '软件工程'; -- 强制使用 idx_user_pro 索引 EXPLAIN SELECT * FROM tb_user FORCE INDEX(idx_user_pro) WHERE profession = '软件工程'; ``` #### 存储引擎的选择 选择合适的存储引擎对于性能至关重要。InnoDB适用于需要高事务完整性和致性的场景,尤其是在频繁更新和删除操作的情况下;而MyISAM更适合以读取为主的环境,尤其是当写入较少时[^3]。此外,Memory存储引擎虽然速度极快,但由于其数据完全驻留在内存中,因此适合短期使用的临时表或缓存用途。 | 存储引擎 | 特点 | |----------|----------------------------------------------------------------------| | InnoDB | 支持事务、行级锁、外键约束,适合复杂业务逻辑 | | MyISAM | 高速插入和查询,不支持事务,适合只读或少量修改的应用 | | MEMORY | 所有数据保存在内存中,访问速度快,适合作为临时表或高速缓存 | #### 索引结构详解 MySQL中的索引主要基于B+树实现,这种数据结构能够显著提高查询效率。通过创建索引,可以在定程度上减少全表扫描带来的开销。然而,需要注意的是,索引并非越多越好,过多的索引可能会降低写入性能并占用额外的空间。 ```sql -- 创建普通索引 CREATE INDEX idx_age ON user(age); -- 使用覆盖索引加速查询 SELECT id, name FROM user WHERE age = 45; ``` #### 锁机制简介 为了处理并发控制问题,MySQL提供了多种类型的锁,包括全局锁、表级锁以及行级锁。其中,行级锁是最细粒度的种锁定方式,能够在多用户环境下提供更高的并发能力[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值