`

Innodb数据库内存模型

阅读更多

故事的开篇还得要从一张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:刷新脏页

 

 

  • 大小: 27 KB
2
6
分享到:
评论
1 楼 wst0350 2016-04-07  
感谢分享

相关推荐

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    InnoDB存储引擎 卷1》,读者可以了解到InnoDB的内部工作机制,如如何处理B+树索引、事务的提交与回滚、锁的实现以及内存管理等内容,这对于优化数据库性能、解决并发问题、设计高效的数据模型等都有极大的帮助。...

    mysql-innodb

    这在数据库设计中非常关键,尤其是在实现数据库关系模型时。 4. **缓冲池(Buffer Pool)**: InnoDB维护了一个缓冲池,用于缓存数据和索引,提高数据访问速度。缓冲池的大小可以通过`innodb_buffer_pool_size`...

    数据库系统实现 数据库系统实现

    数据库系统实现是数据库领域的核心议题,它涉及到如何将理论性的数据模型转化为实际可操作的存储结构,以及如何高效地管理、检索和维护这些数据。这本书籍深入探讨了数据库系统的内部工作机制,是提升数据库技术水平...

    Linux运维(数据库)面试题 数据库运维(02).pdf

    关系型数据库是使用关系模型来组织的数据库,具有明确的 schema,使用 SQL 语言来管理和查询数据。非关系型数据库则不使用关系模型,不需要 schema,可以处理大规模数据集合和多种数据类型的挑战。 二、Redis ...

    征途单机版MYSQL数据库

    1. **数据模型优化**:检查数据库的表结构,确保它们符合第三范式,减少冗余数据,提高查询效率。 2. **索引策略**:根据查询需求创建合适的索引,可以显著提升查询速度。 3. **存储引擎选择**:根据业务需求选择...

    数据库常用面试题目_基础题

    数据库是信息技术领域中不可或缺的一部分,尤其在大数据时代,掌握数据库基础知识和实践经验对于求职者来说至关重要。...同时,不断学习和跟踪数据库技术的新发展,如NewSQL、内存数据库等,也是提升自己竞争力的关键。

    开发设计系列MySQL网络数据库技术精粹

    6. **存储引擎**:MySQL有多种存储引擎,如InnoDB(默认,支持事务和行级锁定)、MyISAM(快速读取,不支持事务)和Memory(数据存于内存,适合临时表)。选择合适的存储引擎能显著提升数据库性能。 7. **性能优化*...

    数据库分类知识.zip

    6. 内存数据库(In-Memory Database):所有数据都存储在内存中,如Redis、HANA,提供极快的读写速度,适用于实时分析和高速交易。 接下来,我们专注于MySQL,一个开源、免费的关系型数据库管理系统: 1. MySQL的...

    数据库工程师知识点

    - 数据模型:理解并掌握三种主要的数据模型——关系型模型(如SQL)、层次模型和网络模型。 - 数据结构:了解B树、B+树、哈希表等数据结构及其在数据库中的应用。 - ACID特性:原子性(Atomicity)、一致性...

    数据库系统工程师考试06-08

    首先,基础理论部分包括数据库模型,如关系模型、网络模型、层次模型等,以及ER(实体-关系)图在设计数据库时的作用。关系数据库是主流,因此,对SQL语言的理解至关重要,包括DML(数据操作语言)如SELECT、INSERT...

    历年数据库系统工程师试题

    - 实体-关系模型(E-R模型):用于描述现实世界的实体、属性和关系,是数据库设计的初步阶段。 - 关系模型:由关系、元组、属性和键组成,是关系数据库的基础。 3. SQL语言: - DDL(Data Definition Language...

    数据库设计文档大全经典

    - **数据库配置**:调整内存参数、缓存大小等数据库系统配置,以适应应用负载。 7. **文档编写**: - **数据库架构文档**:详细记录数据库的结构,包括表的设计、索引、约束等。 - **数据字典**:列出所有字段的...

    java+数据库面试题目(精华版)

    4. **内存管理**:JVM内存模型,垃圾回收机制(GC),如何避免内存泄漏。 5. **多线程**:线程的创建方式,同步机制(synchronized,Lock),并发工具类(ExecutorService,Semaphore,CountDownLatch)。 6. **IO...

    ImageBasedModellingEdu-数据库面试题

    逻辑设计是将概念模型转化为具体的数据库模型;物理设计则涉及数据存储和索引优化。 2. 正确的范式化设计是数据库设计的关键,通常我们遵循第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd...

    Mysql数据库性能优化

    MySQL数据库性能优化是一个涵盖多个方面的主题,涉及到数据库配置、索引优化、查询优化、存储引擎选择、内存管理以及数据模型设计等多个环节。以下是对这些关键领域的详细解释: 1. **数据库配置**: - `my.cnf` ...

    数据库性能调优 原理与技术

    这包括合理的数据模型设计,如选择合适的数据类型,避免数据冗余,以及采用范式理论来减少数据不一致性。在关系型数据库中,遵循第三范式(3NF)或更高范式通常能有效防止数据冗余,提高数据一致性和查询效率。 ...

    数据库配置文件

    例如,调整内存分配参数(如innodb_buffer_pool_size)可以优化数据库的读写性能;设置日志文件位置和大小可以帮助监控和恢复数据库状态;配置安全选项(如bind-address)可以保护数据库免受未经授权的访问。 在...

    数据库原理实验指导书.zip

    8. **数据库性能调优**:这部分可能涉及硬件配置、内存管理、存储引擎的选择(如InnoDB和MyISAM)以及数据库参数调整等,以提高整体数据库系统的性能。 9. **数据库应用系统开发**:实验可能包含如何在实际项目中...

    数据库笔试面试题汇总

    - **Redis与Memcached**:内存数据库的特性,适用场景,以及它们之间的对比。 - **事件驱动架构**:消息队列(如Kafka)在数据库实时处理中的作用。 8. **数据库发展趋势**: - **NewSQL**:结合传统RDBMS和...

    数据库设计之宾馆管理系统

    也可能涉及数据库参数调优,如内存分配、缓冲池大小等;还可以通过数据库集群、读写分离等方式提升系统整体性能。 总结来说,数据库设计之宾馆管理系统涵盖了从需求分析到物理模型设计的全过程,涉及实体关系建模、...

Global site tag (gtag.js) - Google Analytics