• MySQL—MySQL的存储引擎之InnoDB


    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)

    表空间

    磁盘文件之存储结构

    存储结构

    内存数据落盘

    内存数据落盘

  • 相关阅读:
    服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?
    既生瑜,何生亮?
    Vue选项: Methods方法
    Flink内核源码(七)Flink SQL提交流程
    【JavaSwing - 目录】
    vue项目打包成dist文件夹之后后端请求报404错误解决方法
    CLIP模型原理与代码实现详解
    CodeWhisperer proxy代理连不上(解决)
    照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成
    【Hexo博客】将静态博客部署到服务器
  • 原文地址:https://www.cnblogs.com/nicaicai/p/18158695