文章目录

    • @[toc]
  • Buffer Pool
    • buffer pool对内存的管理
      • Free List
      • LRU List
        • LRU(least recently used)算法
      • Flush List
  • Innodb关键特性
    • Insert Buffer插入缓冲
      • Insert Buffer
      • change buffer
      • insert buffer的内部实现
    • double write 两次写
    • 自适应哈希索引(Adaptive Hash Index,AHI)
    • 刷新临近页

Buffer Pool

InnoDB存储引擎是基于磁盘存储的,并将其中的数据按照页的方式进行管理(缓冲页)。基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。

缓冲池中存储的数据页类型有: 索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、innodb存储的锁信息(lock info)、数据字典等;

数据页、索引页占大部分缓冲池空间;

读数据页时,首先将数据读到缓冲池中,下次读写相同的页时,先去缓冲池中找;
对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上,并不是每次页发生改变就刷新回磁盘,而是通过一种叫做checkpoint的机制把页刷新会磁盘。

InnoDB buffer默认为一个缓冲池实例,可以自行配置。每个页根据哈希值平均分配到不同的缓冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库并发处理能力。

缓冲池的大小直接影响着数据库的整体性能。对于InnoDB存储引擎而言,其缓冲池的配置通过参数innodb_buffer_poolsize来
设置。innodb_buffer_pool_instances: 设置有多少个缓冲池。通常建议把缓冲池个数设置为CPU的个数。

当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中。
也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。

buffer pool对内存的管理

Free List

free链表,该链表中记录了没有被使用的页,每次申请数据块都是要从free链表中取。

LRU List

LRU列表用来管理已经读取的页,当数据库刚启动时 LRU List是空的,此时页都存放在Free List中;

先从Free List中查找是否有可用的空闲页,有则从Free List中删除 并 加入到 LRU List中,若没有空闲页则根据LRU算法淘汰LRU List尾部的页;

自适应哈希索引(adaptive hash index)、innodb存储的锁信息(lock info)、数据字典等不在LRU List中;

了解
innodb支持页的压缩,即将16k的页压缩为1kb、2kb、4kb、8kb,对于非16kb的页用unzip_list列表进行管理到。unzip_lsit属于LRU list。

LRU(least recently used)算法

一般的LRU算法将使用最频繁的页总是在链表的前面,而最后的页就是要被释放掉的页;但是Innodb的LRU有所不同;

InnoDB的主要改进点在于每次将磁盘上读出的数据不是直接放到链表的头部,而是放在链表的midpoint处,只有在下次访问该页时,才会将该页移动到链表头部。

midpoint默认在LRU列表的5/8处,可由innodb_old_blocks_pct参数配置;innodb_old_blocks_time  ,控制数据页被读取到minpoint处 多久以后才能被加入到LRU列表的首部;

Flush List

fush列表中的页是脏页列表,即fush列表用来管理将页刷回磁盘;

注意,脏页 也存在于LRU list中;


Innodb关键特性

Insert Buffer插入缓冲

Insert Buffer

对于具有AUTO_INCREMENT属性的主键,对行记录的存放是顺序的,效率高,非自增的主键(例如uuid) 或者 辅助索引 则插入操作是随机的。

对于非聚集索引的 插入 或 更新 操作,不是每次直接插入索引页中,而是先判断要操作的非聚集索引页是否在缓冲池中,若在,则直接操作;若不在,则先放入Insert Buffer中,然后按一定频率将insert buffer 与 辅助索引叶子节点 进行合并merge操作;

insert buffer的使用条件;
1. 索引是辅助索引;
2. 索引不唯一;
只有满足上面2个条件,innodb才会使用insert buffer
insert buffer的缺点;
1. 若在合并之前宕机,恢复需要时间;
2. 在写密集的情况下,insert buffer会占用过多的buffer pool;默认最大可以占用1/2的缓冲池内存,但是可以通过ibuf_pool_size_pre_max_size进行修改;

change buffer

change buffer 是对 Insert Buffer 的升级;

使用change buffer ,innodb可以对insert、delete、update都进行缓冲,分别是insert buffer、delete buffer、purge buffer;

通过innodb_change_buffering参数可以控制开启各种buffer;
通过innodb_change_buffer_max_size可以控制change buffer的最大内存;

insert buffer的内部实现

insert buffer的数据结构是一颗B+树,早期的insert buffer 每张表都有一棵B+树,现在全局只有一颗B+树,负责对所有表的辅助索引进行insert buffer;

space表示待插入记录所在的表空间ID,可以通过space ID得知是哪张表;
marker为了兼容老版本的insert buffer;
offset表示页所在的偏移量;

叶子节点中,space、marker、offset含义与之前相同;第五列开始是插入记录的字段;


double write 两次写

partial page write(部分写失效)问题

当数据库正在从内存向磁盘写一个数据页时,这个页只写了部分数据,比如16k的页,只写了前4k,之后发生了宕机,这种情况称为(partial page write)部分写失效。这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。

double write 由2部分组成
1)内存中的两次写缓冲(doublewrite buffer),大小为2MB
2)磁盘上 共享表空间 中连续的128页(2个区),大小也为2MB

double write原理

  1. 缓冲池的脏数据刷新时,先 通过menmcpy函数将脏页复制到内存中的doublewrite buffer,
  2. 然后由doublewrite buffer分2次,每次1M顺序写入磁盘上的共享表空间,
  3. 然后调用fsync函数将doublewrite buffer的数据同步磁盘数据文件;

其中,将doublewrite buffer中的数据写入共享表空间属于顺序写,开销小,将doublewrite buffer中的数据写入磁盘数据文件开销大


自适应哈希索引(Adaptive Hash Index,AHI)

innodb会监控表上各索引页的查询,如果观察到建立hash索引可以提升性能则建立哈希索引,称为AHI;

AHI由缓冲池的B+树构建而来,构建速度快;

缺陷1、hash自适应索引会占用innodb buffer pool;2、自适应hash索引只适合搜索等值的查询,如select * from table where index_col='xxx',而对于其他查找类型,如范围查找,是不能使用的;

刷新临近页

当刷新一个脏页时,innodb还会检测该页所在区(extent)的所有页,如果有脏页就一起刷新;


innodb 关键特性、缓冲池、插入缓冲、两次写相关推荐

  1. InnoDB关键特性之插入缓冲

    Insert Buffer:主要用于提高非聚集索引的插入和更新性能 聚集索引和非聚集索引 聚集索引就是数据索引按照索引排序,且内容也是顺序存储(等价于汉语字典按照拼音索引排序) 非聚集索引索引项按照顺 ...

  2. [MySQL] InnoDB三大特性之 - 插入缓冲

    InnoDB存储引擎有三大特性非常令人激动,它们分别是插入缓冲.两次写和自适应哈希,本篇文章先介绍第一个特性 - 插入缓冲(insert buffer) 在上一篇<MySQL - 浅谈InnoD ...

  3. InnoDB关键特性之doublewrite

    部分写失效 想象这么一个场景,当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失.这时是无法通过重做日志恢复的,因为重做日志记录的是对 ...

  4. 按顺序插入图片_MysqlInnodb特性之插入缓存

    InnoDB存储引擎的关键特性包括插入缓冲.两次写(double write).自适应哈希索引(adaptive hash index).这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性. ...

  5. 谷歌、脸书、魔兽世界都在用!InnoDB是什么?有哪些关键特性?

    导读:InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracle数据库的架构.通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才 ...

  6. mysql 插入缓冲

    在看<mysql技术内幕:innodb存储引擎>看到插入缓冲,google了一下,发现如下解释: 摘录自:http://www.itpub.net/viewthread.php?tid=1 ...

  7. 华为云CSE关键特性,支持托管Nacos注册配置中心

    什么是Nacos Nacos是 Dynamic Naming and Configuration Service的首字母简称,相较之下,它更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. ...

  8. Mysql关键特性-插入缓冲 (Insert Buffer)

    1.什么是插入缓冲 (Insert Buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,这里讲的缓冲是针对的非聚集索引并且索引不是唯一的. 对 ...

  9. MySQL :InnoDB 存储引擎(lnnoDB 关键特性)

    asdsInnoDB 是事务安全的MySQL 存储引擎,设计上采用了类似于Oracle 数据库的架构.通常来说, InnoDB 存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoD ...

  10. 什么是Mysql的next-key、插入缓冲、二次写、自适应哈希索引和预读

    目录 楔子 一.间隙锁(Next-Key锁) 二.插入缓冲(Insert Buffer) 2.1.什么是insert buffer? 2.2.insert buffer的触发条件? 2.3.为什么不能 ...

最新文章

  1. VC10中的C++0x特性简介
  2. hive double 转decimal_一起学习Hive基础(多知识点)
  3. 图论--差分约束系统
  4. 【考研计算机】AOE关键路径
  5. 在PHP中数组有两种形式区别,PHP三种数组合并方式区别示例
  6. mysql5.5从零开始_【MySQL函数】MySQL 5.5从零开始学第六章
  7. 简述python的优点_Python是什么及Python的优点和缺点
  8. DingTalk机器人C#代码
  9. Elasticsearch 之索引创建原则
  10. 维护和维修涉密计算机网络 必须严格采取,安全保密管理员主要负责涉密网络的日常安全保密管理工作,包括()。A.涉密网络的日常运行维护工 - 普法考试题库问答...
  11. EJB是什么,什么是EJB
  12. Android进阶——更节电的后台任务JobScheduler 机制使用详解
  13. 查看TRP开头的数据量超过1000000的表的index情况
  14. 2021年美国大学生数学建模竞赛C题参考翻译
  15. C语言之实用调试技巧
  16. 【软考-软件设计师精华知识点笔记】第十章 网络与信息安全
  17. NLP-统计词频之处理停用词
  18. jmeter4.0 统计结果次数 BeanShell Sampler,Debug Sampler
  19. 同一个ssh key用在多台电脑上
  20. 20210212web04mysql多表,事务

热门文章

  1. mysql python用法_python-mysql基本用法
  2. 10投屏后没有声音_10年后,学区房有没有可能成为“负资产”?这位专家说了实话...
  3. Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
  4. 151.翻转字符串里的单词
  5. mysql怎么添加第二行,如何在mysql中得到結果查詢中只有第二行?
  6. 现代通信原理4.3:白噪声
  7. 杭电HDUacm2037
  8. Ubuntu 自动安装libsvm
  9. Beautiful Soup 4.2.0 文档
  10. css中margin标记可以带一个、二个、三个、四个参数,各有不同的含义