首页 > 数据库 >MySQL—MySQL的存储引擎之InnoDB

MySQL—MySQL的存储引擎之InnoDB

时间:2024-04-25 21:44:55浏览次数:24  
标签:存储 Buffer 索引 InnoDB MySQL 数据 Pool

MySQL—MySQL的存储引擎之InnoDB

存储引擎及种类

存储引擎 说明
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢
ISAM MyISAM的前身,MySQL5.0以后不再默认安装
MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用
Memory 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失
Archive 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作
CSV CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换)

怎么选择存储引擎?

除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该选择InnoDB引擎。(大部分情况下都选择InnoDB。)

InnonDB和MyISAM的比较

比较项 InnonDB MyISAM
存储文件 .frm是表定义文件
.ibd是数据文件和索引文件
.frm是表定义文件
.myd数据文件
.myi是索引文件
支持表锁、行锁 支持表锁
是否支持外键 支持外键 不支持外键
是否支持事务 支持 不支持
CRUD 读、写 读多
索引结构 B+Tree B+Tree
show engines;

查看存储引擎

InnonDB架构

InnonDB架构图如下:

InnonDB架构图

从图中可见,InnoDB存储引擎由内存结构、磁盘结构两部分组成。

内存结构

lnnoDB内存结构主要分为如下四个区域:

  1. Buffer Pool缓冲池
  2. Change Buffer修改缓冲
  3. Adaptive Hash lndex自适应索引
  4. Log Buffer日志缓冲

缓冲池(Buffer Pool)

缓冲池Buaffer Pool用于加速数据的访问和修改,通过将热点数据缓存在内存的方法最大限度地减少磁盘IO,加速热点数据读写。

  • 默认大小为128M,Buffer Pool中数据以页为存储单位,其实现的数据结构是以页为单位的单链表。
  • 由于内存的空间限制,Buffer Pool仅能容纳最热点的数据。
  • Buffer Pool使用LRU算法 (Least Recently Used最近最少使用)淘汰非热点数据页。
  • LRU:根据页数据的历史访问来淘汰数据,如果数据最近被访问过,那么将来被访问的几率也更高,优先淘汰最近没有被访问到的数据。
  • 对于Buffer Pool中数据的查询,InnoDB直接读取返回。对于Buffer Pool中数据的修改,lnnoDB直接在Buffer Pool中修改,并将修改写入redo log。

修改缓冲(Change Buffer)

用于加速非热点数据中二级索引的写入操作。

修改缓冲对二级索引的修改操作会录入redo log中。

在缓冲到一定量或系统较空闲时进行merge操作(写入磁盘) ;

其物理结构为一棵名为ibuf的B+树。

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

用于实现对于热数据页的一次查询,是建立在索引之上的索引。

作用:对频繁查询的数据页和索引页进一步提速

AHI大小为Buffer Pool的1/64

对于二级索引,若命中 AHI,则将直接从 AHI 获取二级索引页的记录指针,再根据主键沿着聚簇索引查找数据;若聚簇索引查询同样命中 AHI,则直接返回目标数据页的记录指针,此时就可以根据记录指针直接定位数据页。

自适应哈希索引

日志缓冲(Log Buffer)

InnoDB使用Log Buffer 来缓冲日志文件的写入操作。内存写入加上日志文件顺序写的特点,使得InnoDB日志写入性能极高。

这种将分散操作改为批量操作的优化方式将增加数据丢失的风险。

磁盘文件之表空间

在磁盘中,InnoDB将所有数据都逻辑地存放在一个空间中,称为表空间(Tablespace)。表空间由段(Segment) 、区(extent) 、页(Page)组成。

  • 开启独立表空间innodb_file_per_table=1,每张表的数据都会存储到一个独立表空间,即表名.ibd文件
  • 关闭独占表空间innodb_file_per_table=0,则所有基于InnoDB存储引擎的表数据都会记录到系统表空间,即ibdata1文件

表空间是 InnoDB 物理存储中的最高层,目前的表空间类别包括:

  • 系统表空间(System Tablespace)
  • 独立表空间(File-per-table Tablespace)
  • 通用表空间(General Tablespace)
  • 回滚表空间(Undo Tablespace)
  • 临时表空间(The Temporary Tablespace)

表空间

磁盘文件之存储结构

存储结构

内存数据落盘

内存数据落盘

标签:存储,Buffer,索引,InnoDB,MySQL,数据,Pool
From: https://www.cnblogs.com/nicaicai/p/18158695

相关文章

  • FLINKCDC 3.0整库同步MYSQL至DORIS(FLINK1.18): 历程
    大数据技术涉及组件较多,各个环境较DEMO又不尽相同,所以参照DEMO进行,任然很多报错信息出现。如下报错处理,尽供参考:1.创建同步配置文件################################################################################Description:SyncMySQLalltablestoDoris#########......
  • 记录MySQL分页数据重复问题
    1、准备数据2、sql查询1、查询第一页的结果select*fromtestlimit0,3;2、查询第二页的结果select*fromtestlimit1,3;3、查询第三页的结果select*fromtestlimit2,3;3、结果由上图所示,每次分页都有重复数产生4、原因我们知道orderby排序的时......
  • mysql系列04---索引及性能分析
    1、索引的结构 mysql索引的数据结构,对经典的B+Tree进行了优化,在原B+Tree上增加了一个指向相邻叶子结点的链表指针,就形成了一个带有顺序指针的B+Tree,提高了区间访问的性能。 选择B+Tree的优点:a、相对于二叉树,层级更少,搜索效率更高b、相对于B-Tree,B+Tree只在叶子节点上存储......
  • 如何使用 SFDX CLI 拉取存储在 Public 文件夹的邮件模版(How to retrieve an email tem
    SELECTDeveloperName,FolderName,IsActiveFROMEmailTemplateSELECTDeveloperName,Folder.DeveloperName,IsActiveFROMEmailTemplate使用下面的命令可以正确获取到public文件夹下的邮件模版sfdxforce:source:retrieve-mEmailTemplate:unfiled\$public\/My_te......
  • Mysql8 设置允许远程连接 (Windows环境)
    1.Windows防火墙开放端口3306: 2.修改mysqlmy.ini配置文件(C:\ProgramData\MySQL\MySQLServer8.0)添加或修改允许所有IPbind-address=0.0.0.03.Windows打开CMD命令窗口--登录mysqlmysql-uroot-p;--添加权限grantallon*.*to'root'@'localhost';--刷新......
  • MySQL - [13] binlog、redolog、undolog、delaylog
    题记部分 binlog    redolog      undolog  3.1、什么是undo log事务是需要保证原子性的,也就是说,事务中的操作要么全部完成,要么什么也不做。但有如下情况,会造成事务执行不完。①事务执行过程中可能遇到各种错误,比如:代码bug出现异常。②......
  • MySQL中实现支持Emoji表情存储
    MySQL中实现支持Emoji表情的存储要让MySQL支持Emoji,详细步骤:步骤1:确认MySQL版本确保您使用的MySQL版本至少为5.5.3,因为这是开始支持utf8mb4字符集的起始版本。如果您当前的版本低于此要求,您需要先升级MySQL到一个支持utf8mb4的较新版本。步骤2:检查现有表结构查看您的数据库、......
  • [转帖]MySQLdump之single-transaction详解
     作者:@张扶摇本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhangshengdong/p/9196128.html目录MySQLdump之single-transaction详解single-transaction保存点的日志分析查看当前会话级别导出文件的字符集类型MySQLdump之single-transaction详解single-transact......
  • 解决mysql 事务死锁的方法
    使用以下命令查看引擎的状态SHOWENGINEINNODBSTATUS; 如果有事务死锁可以看到如下图的关键字 找到上图的线程id使用kill57763.解决问题。问题回放,事务死锁如何产生?本地调试,长事务,调试至中途,断开调试,事务未提交。下次进入事务时候同样参数会触发锁。必须kill......
  • 1.MySQL
    1.1索引使用注意事项(1)索引失效情况在索引上做运算、函数、对索引列进行隐式转换(索引列式字符串,但Sql产讯未使用引号)在索引列使用左模糊查询,全模糊查询联合索引未使用最左匹配原则(2)不适用场景表数据量少不适合加索引更新频繁的表不适合加索引区分度低的字段不适合加索......