MySQL-- INNODB 引擎

news2024/11/14 13:14:09
1、INNODB引擎的逻辑存储的结构:
第一层的逻辑结构:表空间

        一个mysql实例可以对应多个表空间,用于存储记录,索引数据。

第二层逻辑结构:段

        分为数据段、索引段、回滚段、innodb是索引组织表,数据段是B+Tree的叶子节点,索引段为B+Tree的非叶子节点,段使用管理多个Extent(区)。

第三层逻辑结构:区

        表空间的单元结构,每一个分区的大小是1M,默认的情况下,innodb的存储引擎页的大小是16k,即一个区一共有64ge连续的页。

第四层逻辑结构:页

        是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区。

第五层逻辑结构:行

        innodb存储引擎数据是按照行进行存放的。

2、INNODB架构:内存结构:

1、Buffer Pool:

        缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。缓冲池以Page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型:

        . free page:空闲page,未被使用。

        . clean page:被使用page,数据没有被修改过。

        .dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致。

2、Change Buffer:

        更改缓冲区(针对于非唯一二级索引页),在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中。
        Change Buffer的意义是什么?
与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新可能会影响索引树中不相邻的二级索引贡,如果每一次都操作磁盘,会造成大量的磁盘IO。有了ChangeBuffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO。

3、Adaptive Hash lndex:

自适应hash索引,用于优化对Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,则建立hash索引,称之为自适应hash索引。
自适应哈希索引,无需人工干预,是系统根据情况自动完成。

参数: adaptive_hash_index

4、Log Buffer:

日志缓冲区,用来保存要写入到磁盘中的log日志数据( redo log . undo log),默认大小为16MB,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘l/O。

参数:
innodb_log_buffer_size:缓冲区大小
innodb_flush_log_at_trx_commit:日志刷新到磁盘时机

3、INNODB架构:磁盘结构

1、System Tablespace:

        系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)

参数:innodb_data_file_path
2、File-Per-Table Tablespaces:

        每个表的文件表空间包含单个InnoDB表的数据和索引,并存储在文件系统上的单个数据文件中。

参数:innodb_file_per_table
3、General Tablespaces

        通用表空间,需要通过CREATE TABLESPACE语法创建通用表空间,在创建表时,可以指定该表空间。


4、Undo Tablespaces:

        撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志。


5、Temporary Tablespaces:  

        InnoDB使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。


6、Doublewrite Buffer Files:

        双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,保证数据的安全性,任务失败的时候,可以恢复数据,先将数据页写入双写缓冲区文件中,使于系统异常时恢复数据。

7、Redo Log:

        重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log)),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中,用于在刷新脏页到磁盘时,发生错误时,进行数据恢复使用。

4、后台线程:

指的是再合适的时间将INNODB缓存中的数据刷新到磁盘中。

主要有四类:

        1、Master Thread 

核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收。

        2、IO Thread

在lnnoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大地提高数据库的性能,而IOThread主要负责这些lO请求的回调。

查看INNODB引擎的状态信息:
show  engine innodb status;
        3、Purge Thread(撤销日志线程)

主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收。

        4、Page  Cleaner Thread

协助Master Thread 刷新脏页到磁盘的线程,它可以减轻Master Thread的工作压力,减少阻塞。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1212167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JavaWeb+SpringBoot+Vue电子商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue电子商城微信小程序系统的设计和实现 源码获取入口前言系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 身处互联网时代,互联网无形中影响着人们的吃穿住行,人们享受着不…

2024年春季3月退役的大学生士兵免试专升本单独报名的新政策

关于2024年春季3月退役大学生士兵专升本免试单独报名安排的通知 2024年3月退役的符合条件的大学生士兵单独组织一次报名,网上报名时间另行通知,履行网上报名和信息确认手续,根据要求上传本人头像照片、身份证照片,以及《入伍通知书…

WorkPlus Meet视频会议系统,可私有化部署,保障内部数据安全

WorkPlus Meet作为一款私有化音视频会议平台,具有高度安全性和部署灵活性,能够根据参会人数进行灵活的调配,这样企业可以有效控制会议成本,避免资源浪费。同时,WorkPlus Meet平台支持多种功能,满足不同场景…

做决策、定战略、带团队:顶级高手常用的16个思维模型

01 做决策 1.沃伦巴菲特的双目标清单系统(Two-List System) 弗林特当了巴菲特的私人飞行员十年之久,还曾为美国四任总统开过飞机,但他在事业上依然有更多追求。有一次,他和巴菲特在探讨他的职业生涯目标时&#xff0…

第三方软件测试服务有哪些形式?选择时如何避雷?

高新技术的快速发展,人们对于软件产品越来越依赖,因此软件质量对于软件企业来说至关重要。产品质量的好坏需要通过检测才得知,软件企业为了获得更客观公正的检验结果,会将软件测试交由第三方软件测试服务机构进行?那么有哪些形式…

python采集小破站视频弹幕

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用]: Python 3.8 Pycharm模块使用]: import requests 数据请求 import jieba 分词 import wordcloud 词云 import re 正则通过爬虫程序采集数据 分析数…

ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建

一、涉及软件包资源清单 1、java 这里使用的是openjdk 2、hadoop-3.3.6.tar.gz 3、hbase-2.5.6-hadoop3-bin.tar.gz 4、phoenix-hbase-2.5-5.13-bin.tar.gz 5、apache-zookeeper-3.8.3-bin.tar.gz 6、openssl-3.0.12.tar.gz 二、安装 1、操作系统环境准备 换源 sudo vim /et…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

Python数据结构:字典(dict)详解

1.字典概念 字典在其他语言中可能会被称为“关联存储”或“关联数组”。   在Python中,字典(Dictionary)是一种可变、无序且键值对(key-value pairs)唯一的数据结构。   字典也是一种标准映射类型,mapp…

ChatGPT助力高效办公——神奇的效率工具Airy

Airy是一款免费而又强大的高效办公软件,用户可以通过快捷键和丰富的内置插件,充分发挥GPT-3.5模型的强大功能,轻松实现搜索、翻译、文本生成与写作、文本概括与总结,同时还可以作为一款日程提醒工作,记录和提醒每天要做…

Linux编译器:gcc/g++的使用

我们在学习编译器时,我们不仅要只会使用编译器,还要理解程序的编译过程。一个程序存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令;第2种是执行环境,它用于实际执行代码。本篇文章将…

第十八章 Swing程序设计

Swing用于开发桌面窗体程序,是JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大、性能更加优良。但因为Swing技术推出时间太早,其性能、开发效率等不及一些其他流行技术,所以目前市场上大多数桌面窗体程序都不是由Java开发…

day18_多线程

今日内容 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、线程池 零、 复习昨日 见晨考 一、线程安全[重点] 1.0 线程不安全 当前线程的数据被其他线程修改 1.1 线程安全 临界资源:共享资源(同⼀个对象),一次只可以有一个线程操…

JS-项目实战-代码优化-事件动态绑定

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

【Maven】进阶

文章目录 1. 聚合2. 继承3. 属性变量定义与使用4. 版本管理5. 资源配置6. 多环境配置7. 跳过测试(了解) 1. 聚合 为了防止某个模块(dao)更新了,重新编译了,导致和其他模块不兼容,需要用一个roo…

使用boost库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

tsmc12 nm boundary cell注意事项

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章导读: boundary cell添加失败问题整理 注意N/P的区别 针对上下两边的boundary cell,有N/P类型的区别,看版图衬底形状上下是不对称的,而且P

深入理解SqueezeSegV3点云分割

文章:Squeezesegv3: Spatially-adaptive convolution for efficient point-cloud segmentation 代码:https://github.com/chenfengxu714/SqueezeSegV3 一、摘要 激光雷达点云分割是许多应用中的一个重要问题。对于大规模点云分割,一般是投…

零代码数字孪生设计平台的功能特点

在当今数字化的时代,企业的转型已经成为必然的趋势。而在这个过程中,3D数字孪生无代码编辑工具正成为企业实现数字化转型的新价值点。客户可以无需任何专业知识和专业软件的支持,仅仅通过互联网和浏览器即可根据购买要求对自己的产品/设备/园…

vite => .env 文件配置和使用

.env.development .env.production VITE_API_BASE_URL /api # 开发环境代理地址 .env.development 是在开发环境中的代理地址 .env.production 是在线上的代理地址 ( 两个 .env 内部的变量都是一样的 vite 会在你开发环境和线上环境自动做切换 ) …