iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL学习笔记(一)InnoDB内存数据结构浅析
  • 269
分享到

MySQL学习笔记(一)InnoDB内存数据结构浅析

MySQL学习笔记(一)InnoDB内存数据结构浅析 2019-05-07 19:05:13 269人浏览 无得
摘要

Innodb存储引擎是目前Mysql最主流的存储引擎,学习Innodb, 可以先从其最基础的数据结构开始。Innodb的数据结构主要包括内存数据结构(In-MemoryStructures),如buffer pool, change bu

MySQL学习笔记(一)InnoDB内存数据结构浅析

Innodb存储引擎是目前Mysql最主流的存储引擎,学习Innodb, 可以先从其最基础的数据结构开始。Innodb的数据结构主要包括内存数据结构(In-MemoryStructures),如buffer pool, change buffer, log buffer等, 磁盘数据结构(On-DiskStructures),如索引Index, 表空间及日志结构等。

Buffer Pool

Buffer Pool主要是对Innodb存储引擎中的数据表(Table)和索引数据(Index)的一个缓存,它使得mysql可以直接对一些热数据在内存中进行读取。Innodb BufferPool的作用和操作系统中的Page Cache类似,作为缓存子系统,它们在设计和实现上有很多类似的地方。比如,Buffer Pool也使用page作为管理数据页的最小基本单元,同时使用链表来管理内存页,并且页框的淘汰回收算法都使用了LRU。不同的地方在于,linux的页框回收算法中使用inactive和active两个链表来管理数据页pages,而在Innodb中,所有的数据页pages都在一个链表上,它通过一个中间点(MidPoint)指针将链表分为“new”和“old”两个子链表。

如上图所示,当数据页第一次被访问读入内存时,它被插入到MidPoint的位置,也就是“old”子链表的头部。通常来说,数据页被读入内存可能是因为一个query操作,或者是Innodb的预读操作。一个数据页如果是因为query操作被读入内存的,则它会被移动到整个链表的头部。有的数据页是被预读进来的,它不一定会立即被访问,此时它会一直存在于“old”链表内,直到它被淘汰。基于LRU的淘汰策略都存在一个瞬时访问命中率下降的问题。例如,Mysql在进行全表扫描时,会将大量的数据页读入内存,这些数据页几乎都不会再被上层查询所使用,因此又会快速的成为“old” pages被淘汰出内存。所以全表扫描的开销非常大,并且会污染Buffer Pool中的热数据。Innodb提供了一些设置来缓解这种情况。

首先,你可以通过设置参数“innodb_old_blocks_pct”来控制LRU链表中“old” pages的比例,其默认值是37,即有3/8的内存数据页会作为淘汰算法的候选页。“innodb_old_blocks_pct”的可设置范围为[5, 95],将该参数设成一个较小值,可以减轻全表扫描对内存热数据的影响,此时Buffer Pool中只有很少一部分空间会进行淘汰,而真正的热数据会被一直保留。另外一个参数“innodb_old_blocks_time”设置了一个时间窗,来规定一个数据页被插入到MidPoint之后,在多少时间后可以被移动到“new”子链表头部。

例如,将“innodb_old_blocks_time”值设置为1000ms(即1s),那么一个数据页被读入内存后,它在1s内无论被访问多少次,也不会成为热数据页。这个参数值可以缓解全表扫描引入的缓存污染问题。比如像全表扫描或预读load进内存的数据页,它们在很短一段时间内被访问后就不会再被访问了,那么此时他们仍然在“old”链表中,可以更快速的被淘汰出内存。

Change Buffer

Change Buffer使用了Buffer Pool的一部分空间,它主要对部分不在Buffer Pool中的数据页的写操作(包括插入,更新和删除)进行缓存。通常来说,Innodb所更新的一个数据页不在Buffer Pool中时,需要将数据页读入内存再进行更新操作,但是这会带来额外的io开销。使用Change Buffer可以将这部分更新操作先进行缓存,当下次读入这些数据页时,更新操作会merge到数据页上。也有可能系统没有访问这些数据页,此时Change Buffer中的更新操作会被系统定期的sync到磁盘。

值得注意的是,Change Buffer只缓存对二级索引的更新操作。因为相较于主键索引的连续有序且唯一性,二级索引通常是不唯一的,且更新二级索引会有大量的随机IO操作,这对系统性能的影响很大,因此对这部分更新操作进行缓存的收益更加明显。

另外一个需要关注的问题是Change Buffer中的操作是如何持久化。在Innodb中,Change Buffer的更新操作和普通数据的更新操作类似,也会写redo log。最开始Change Buffer使用的是系统表空间,当数据页读入内存并进行merge操作后,系统会记录该数据页redo log并将其标记为脏页,该数据页的变更会被刷回磁盘。因此,Buffer Pool中的更新操作最终都会持久化到磁盘中。

Log Buffer

Redo Log日志文件也需要相应的内存数据结构来进行缓存操作。Log Buffer就是用于缓存日志文件的内存空间,其空间大小可以通过数“innodb_log_buffer_size”来设定。通常来说,日志文件的每次更新都应该刷会磁盘,不然就会有数据丢失或不一致的风险。“innodb_flush_log_at_trx_commit”参数用于设置日志刷回磁盘的频率,其默认值为1,即每次事务提交时,都会记录日志,并将其刷回到磁盘。该参数值为0时,日志写入和刷回磁盘的操作为每秒1次;该参数值为2时,每次事务提交时都会写入Log Buffer,但Log Buffer更新到磁盘的操作为每秒1次。

Innodb系统架构

上图是Innodb内存数据和磁盘数据结构的示意图,左边就是本文主要学习的内存数据结构。之前也提到,Buffer Pool在Innodb中的作用类似于操作系统中的Page Cache,在图中也可以看到,Buffer Pool绕过了系统缓存,通过O_DIRECT方式来读写数据。所以对Buffer Pool的管理,相当于是Innodb为数据库这种存储系统设计的缓存管理。而Log Buffer并没有使用Buffer Pool的空间,使用的是系统缓存。

小结

本文简要描述了Innodb Buffer Pool, Change Buffer, LogBuffer这三种内存数据结构,作为记录Innodb存储引擎的开篇内容相对基础,有疑问或感悟欢迎在留言区讨论。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL学习笔记(一)InnoDB内存数据结构浅析

本文链接: https://www.lsjlt.com/news/4518.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP学习笔记:数据结构与算法
    概述:数据结构和算法是计算机科学中非常重要的两个概念,它们是解决问题和优化代码性能的关键。在PHP编程中,我们常常需要使用各种数据结构来存储和操作数据,同时也需要使用算法来实现各种功能。本文将介绍一些常用的数据结构和算法,并提供相应的PHP...
    99+
    2023-10-21
    学习笔记 PHP 数据结构 PHP 算法
  • Python学习笔记一(Python数据
    Python数据类型主要包括数字,字符串,列表,元组和字典。字符串,列表,元组和字典都是序列,序列最主要两个特点是索引操作和切片操作,索引操作让我们从序列中抓取一个特定项目,切片操作让我们能够获取序列的一个切片,即一部分序列。1.数字 ...
    99+
    2023-01-31
    学习笔记 数据 Python
  • 来年加薪必备,2020年攻破数据结构与算法学习笔记-数据结构篇
    著名数据专家沃斯曾说:算法+数据结构=程序今天我们就来讲讲数据结构1. 数组数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。具有的特性:线性表连续的内存空间相同类型的数据可以随机访问数据操作比较...
    99+
    2023-06-04
  • PHP学习笔记:数据分析与挖掘
    数据分析与挖掘是当前IT领域热门的一个方向,在各个行业都能发挥重要作用。而PHP作为一种流行的编程语言,也能够通过其强大的数据处理能力,为数据分析与挖掘提供支持。本文将结合具体的代码示例,介绍如何使用PHP进行数据分析与挖掘。一、数据准备在...
    99+
    2023-10-21
    数据分析 挖掘 PHP
  • ASP 数据类型学习笔记:如何存储数据?
    在 ASP 中,数据类型是非常重要的概念。正确的使用数据类型可以提高程序的运行效率和安全性。本文将介绍 ASP 中常用的数据类型以及如何存储数据。 一、数据类型 ASP 支持多种数据类型,下面是 ASP 中常用的数据类型: 字符串类型(...
    99+
    2023-10-16
    学习笔记 存储 数据类型
  • 如何理解MySQL数据库Innodb内存结构以及怎样使用内存的
    如何理解MySQL数据库Innodb内存结构以及怎样使用内存的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述很多朋友可能会有许多关于I...
    99+
    2024-04-02
  • python学习3-内置数据结构3-by
    一、字符串与bytesstr是文本系列,有编码,bytes是字节系列,没有编码,文本的编码是字符如何用字节来表示。都不可变,python3默认使用utf8。文本转换编码:s.encode(['编码方式'])编码转换文本:s.decode([...
    99+
    2023-01-31
    数据结构 python
  • PHP学习笔记:XML与JSON数据的解析
    一、引言在现代的互联网应用开发中,数据的传输和交换是非常常见的需求。而XML和JSON都是常用的数据格式,它们具有结构化和可读性高的特点,因此在数据的解析和处理中被广泛应用。本文主要介绍如何使用PHP进行XML和JSON数据的解析,以及附上...
    99+
    2023-10-21
    PHP JSON xml
  • Python 数组 path 学习笔记:如何将数组转换为其他数据结构?
    Python 数组是一种基本的数据结构,它可以用来存储一系列的数据。数组在 Python 中也被称为列表,是一种有序的数据结构,可以存储任意类型的数据,包括数字、字符串、甚至是其他数组。在实际的应用中,我们经常需要将数组转换为其他的数据结...
    99+
    2023-08-19
    数组 path 学习笔记
  • MySQL的InnoDB存储引擎的数据页结构详解
    目录1 InnoDB页的概念2 数据页的结构3 记录在页中的存储4 Page Directory页目录5 File Header文件头部6 InnoDB页和记录的关系7 没有索引时查...
    99+
    2024-04-02
  • python学习3-内置数据结构3-字符
    字符串是集合类型1、定义s = 'hello python's = "hellp python"以上2种没有区别s = '''hello python'''s = """hello python"""以上2种没有区别区别在于三引号可以定义多...
    99+
    2023-01-31
    数据结构 字符 python
  • 一步步带你学习设计MySQL索引数据结构
    目录前言索引介绍索引设计目标索引设计迭代迭代一迭代二迭代三迭代四迭代小结索引结构总结聚簇索引非聚簇索引联合索引索引优点和缺点优点缺点总结前言 mysql的索引是一个非常重要的知识点,也基本上是面试必考的一个技术点,所以非...
    99+
    2024-04-02
  • python学习3-内置数据结构2-元组
    元组是不可变的,可hash 1、定义t = tuple()t = (1,2,3)2、查t[index] #按照下标获取值t.index(value) #按照值获取下标值,不存在报value errott.count(value) #获取某个...
    99+
    2023-01-31
    数据结构 python
  • python学习3-内置数据结构1-列表
    列表及常用操作    列表是一个序列,用于顺序的存储数据1、定义与初始化lst = list() #使用list函数定义空列表lst = []    #使用中括号定义列表lst = [1,2,3]    #使用中括号定义初始值列表lst =...
    99+
    2023-01-31
    数据结构 列表 python
  • LeetCode学习笔记:如何在ASP项目中应用算法和数据结构?
    在ASP项目中,算法和数据结构的应用是至关重要的。它们可以帮助我们更有效地解决问题,提高程序的效率和性能。在本篇文章中,我们将讨论如何在ASP项目中应用算法和数据结构,并通过一些实例来演示其应用。 一、算法的应用 排序算法 在ASP项...
    99+
    2023-06-23
    leetcode 学习笔记 日志
  • Python数据分析入门--灰色预测学习笔记
    文章目录 一、灰色预测简介二、GM(1,1)模型的原理1. 级比检验2. 构造累加序列3. 生成紧邻均值序列4. 建立灰微分方程5. 求解白化方程6. 精度检验 三、Python实现GM(...
    99+
    2023-09-16
    python 数据分析 学习
  • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解
    Mysql逻辑架构介绍总体概览 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的...
    99+
    2024-04-02
  • 如何在Java学习笔记中存储和加载数据?
    Java学习笔记是每个Java初学者必备的工具,它不仅能够记录学习过程中的重要知识点,还能帮助你更好地掌握Java编程语言。在Java学习笔记中,存储和加载数据是一个非常重要的话题,本文将为您详细介绍如何在Java学习笔记中存储和加载数据。...
    99+
    2023-09-02
    学习笔记 存储 load
  • 学习笔记:如何在PHP中使用数组存储数据?
    PHP是一种强大的编程语言,它提供了各种各样的数据结构,其中数组是最常用的之一。使用数组可以方便地存储和访问数据。在本文中,我们将学习如何在PHP中使用数组存储数据。 创建数组 在PHP中,可以使用array()函数创建一个数组。该函数...
    99+
    2023-08-05
    存储 学习笔记 数组
  • numpy 学习笔记:Python 框架中的数据分析利器
    随着数据科学和机器学习的快速发展,Python 成为了最流行的数据分析和机器学习语言之一。Python 有着丰富的数据分析工具和库,其中 numpy 库是最流行的之一。numpy 是一个用于数值计算和科学计算的 Python 库,它提供了...
    99+
    2023-10-23
    框架 学习笔记 numpy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作