故事的开篇还得要从一张Innodb内存模型图讲起:
缓冲池
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。通常使用缓冲池来提高数据库的整体性能。缓冲池简单说就是一块内存,通过内存的速度弥补磁盘速度较慢对数据库性能的影响。
在数据库中进行读操作时,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判定 是否存在缓冲池中,如果有就是被命中直接读取,没有的话就从磁盘中读取。
在数据库进行改操作时,首先写到缓冲池中的页(1),然后在以一定的频率刷新(2)到磁盘上。
重要参数大致有:
1> innodb_buffer_pool_size ## 缓冲区大小
2> innodb_buffer_pool_instances ## 缓存池实例个数,每个页根据哈希值平均分配到不同 的实例中,以减少数据库内部资源的竞争,增加数据库的并发处理能力。
(1)一页默认是16KB,在分配页时采用unzip_LRU压缩内存技术。其具体实践方式是:例如当需要分配一个4KB的页时,会先找是否有4KB空闲页,如果没有再找是否有8KB的空闲页,如果没有就切分一个16KB的页为两个8KB的页,再将其中一个8KB的页切分成两个4KB的页。取其中一个4KB的页用于分配。
(2)这里并不是当页发生变更时触发。而是通过一种checkpoint机制刷新到磁盘。那么什么是checkpoint机制:
它是为了避免每出现一个脏页就就刷新一次磁盘而引入的。简单到来就是Innodb通过这个机制来决定什么时候刷新脏页,宕机之后无需重做全部日志,检查点之前的已经持久化到磁盘中了,只需重做之后的数据就行。其时机大致可以总结为:
1> 缓冲池不够用时,将脏页缓冲到磁盘
2> 重做日志不可用时,刷新脏页
LRU List、Free List和Flush List
这三个list虽然表示的意义不同,但是LRU和Flush之间的数据是有部分交叉的。首先分别一句话概括这三个list是什么鬼:
1> LRU list:存放缓存数据的页。
2> Free list:未使用的页。
3> Flush list:存放脏数据的页。
innoDB存储引擎的缓冲池是通过LRU(Latest Recent Used)算法来进行管理的。
其具体实现方式是:最频繁使用的页在LRU列表(管理已经读取到的页)的前段,最少使用的页在 LRU列表的尾端。
Innodb对LRU算法做了一些优化,加入了midpoint位置。什么是midpoint:
新从文件中加载到内存中的数据默认会先放入midpoint位置,而不是放入LRU列表头部。其目的是为了避免类似全标扫描(这些数据基本只是用一次)之类的操作将热点数据挤出缓存池。
当需要从缓冲池中分配页时,首先从Free列表中查看是否有空闲的空闲页,若有则从Free列表中删除然后加入到LRU列表中。否则根据LRU算法,淘汰LRU列表末尾的页,将该内存空间分配给新的页。在LRU列表中的页被修改后,该页称为脏页(dirry page),这时数据库通过checkpoint机制将脏页刷回磁盘。而Flush列表中的页就是脏页列表。
重做日志缓冲(redo log buffer)
innoDB存储引擎首先将重做日志信息放入这个缓冲区,然后按照一定的频率将其刷入重做日志文件中。重做日志缓冲区一般不需要很多,只要保证每秒产生的事务量在这个缓冲大小之内即可。可以通过innodb_log_buffer_size参数设置大小。
额外的内存池
在innoDB存储引擎中,对内存的管理是通过一种称为内存堆(heap)的方式进行。在对一些数据结构本身的内存进行分配时,需要从额外的内 存池中进行申请,当该区域的内存不够时,需要从缓冲池中申请。
Innodb关键特性
插入缓冲:物化到磁盘。优化非唯一辅助索引的插入操作,实现方式是B+树,和内存中索引页一起确保非聚集索引的性能。
两次写:刷新脏页时,首先将脏页数据复制到内存的2M空间中,然后顺序写入磁盘,如果刷新脏页失败就拿它恢复。
自适应hash索引:系统判断是否开启AHI,当访问模式相同时从缓冲池中的B+树构造而来。
异步IO(AIO):多次发出IO请求,避免了中间因为等待IO完成所消耗的时间。
刷新邻接页:刷新一个脏页时,会检测该页所在区的所有页,如果存在脏页将一并刷新。
线程及作用
Master Thread:1> 合并插入缓冲 2> 将日志缓冲刷新到磁盘
IO Thread(Async IO):读写业务数据,读写插入缓冲,记录日志
Purge Thread:回收undo页,离散读取undo页,可以进一步利用磁盘的随机读写性能
Page Cleaner Thread:刷新脏页
相关推荐
InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型等都有极大的帮助。...
这在数据库设计中非常关键,尤其是在实现数据库关系模型时。 4. **缓冲池(Buffer Pool)**: InnoDB维护了一个缓冲池,用于缓存数据和索引,提高数据访问速度。缓冲池的大小可以通过`innodb_buffer_pool_size`...
数据库系统实现是数据库领域的核心议题,它涉及到如何将理论性的数据模型转化为实际可操作的存储结构,以及如何高效地管理、检索和维护这些数据。这本书籍深入探讨了数据库系统的内部工作机制,是提升数据库技术水平...
通过对MySQL InnoDB源码实现的深入分析,我们可以看到InnoDB在查询优化、Insert Buffer、Checkpoint以及Group Commit等方面采用了多种高级技术来提高数据库系统的性能和可靠性。理解这些核心机制不仅有助于开发人员...
1. **数据模型优化**:检查数据库的表结构,确保它们符合第三范式,减少冗余数据,提高查询效率。 2. **索引策略**:根据查询需求创建合适的索引,可以显著提升查询速度。 3. **存储引擎选择**:根据业务需求选择...
数据库是信息技术领域中不可或缺的一部分,尤其在大数据时代,掌握数据库基础知识和实践经验对于求职者来说至关重要。...同时,不断学习和跟踪数据库技术的新发展,如NewSQL、内存数据库等,也是提升自己竞争力的关键。
6. **存储引擎**:MySQL有多种存储引擎,如InnoDB(默认,支持事务和行级锁定)、MyISAM(快速读取,不支持事务)和Memory(数据存于内存,适合临时表)。选择合适的存储引擎能显著提升数据库性能。 7. **性能优化*...
6. 内存数据库(In-Memory Database):所有数据都存储在内存中,如Redis、HANA,提供极快的读写速度,适用于实时分析和高速交易。 接下来,我们专注于MySQL,一个开源、免费的关系型数据库管理系统: 1. MySQL的...
- 数据模型:理解并掌握三种主要的数据模型——关系型模型(如SQL)、层次模型和网络模型。 - 数据结构:了解B树、B+树、哈希表等数据结构及其在数据库中的应用。 - ACID特性:原子性(Atomicity)、一致性...
首先,基础理论部分包括数据库模型,如关系模型、网络模型、层次模型等,以及ER(实体-关系)图在设计数据库时的作用。关系数据库是主流,因此,对SQL语言的理解至关重要,包括DML(数据操作语言)如SELECT、INSERT...
- 实体-关系模型(E-R模型):用于描述现实世界的实体、属性和关系,是数据库设计的初步阶段。 - 关系模型:由关系、元组、属性和键组成,是关系数据库的基础。 3. SQL语言: - DDL(Data Definition Language...
- **数据库配置**:调整内存参数、缓存大小等数据库系统配置,以适应应用负载。 7. **文档编写**: - **数据库架构文档**:详细记录数据库的结构,包括表的设计、索引、约束等。 - **数据字典**:列出所有字段的...
4. **内存管理**:JVM内存模型,垃圾回收机制(GC),如何避免内存泄漏。 5. **多线程**:线程的创建方式,同步机制(synchronized,Lock),并发工具类(ExecutorService,Semaphore,CountDownLatch)。 6. **IO...
逻辑设计是将概念模型转化为具体的数据库模型;物理设计则涉及数据存储和索引优化。 2. 正确的范式化设计是数据库设计的关键,通常我们遵循第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd...
- **Oracle的起源**:Oracle公司成立于1977年,由Larry Ellison、Bob Miner和Ed Oates共同创立,其初衷是开发基于关系模型的数据库管理系统。 - **Bruce Scott的角色**:他是Oracle早期的关键人物之一,参与了Oracle...
MySQL数据库性能优化是一个涵盖多个方面的主题,涉及到数据库配置、索引优化、查询优化、存储引擎选择、内存管理以及数据模型设计等多个环节。以下是对这些关键领域的详细解释: 1. **数据库配置**: - `my.cnf` ...
这包括合理的数据模型设计,如选择合适的数据类型,避免数据冗余,以及采用范式理论来减少数据不一致性。在关系型数据库中,遵循第三范式(3NF)或更高范式通常能有效防止数据冗余,提高数据一致性和查询效率。 ...
例如,调整内存分配参数(如innodb_buffer_pool_size)可以优化数据库的读写性能;设置日志文件位置和大小可以帮助监控和恢复数据库状态;配置安全选项(如bind-address)可以保护数据库免受未经授权的访问。 在...
8. **数据库性能调优**:这部分可能涉及硬件配置、内存管理、存储引擎的选择(如InnoDB和MyISAM)以及数据库参数调整等,以提高整体数据库系统的性能。 9. **数据库应用系统开发**:实验可能包含如何在实际项目中...