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架构图如下:

从图中可见,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)

磁盘文件之存储结构

内存数据落盘

MySQL—MySQL的存储引擎之InnoDB的更多相关文章

  1. MySQL数据库MyISAM存储引擎转为Innodb

    MySQL数据库MyISAM存储引擎转为Innodb  之前公司的数据库存储引擎全部为MyISAM,数据量和访问量都不是很大,所以一直都没什么问题.但是最近出现了MySQL数据表经常被锁的情况,直接导 ...

  2. Mysql更换MyISAM存储引擎为Innodb的操作记录

    一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...

  3. mysql 常用的存储引擎MyISAM/InnoDB比较

  4. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

    简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...

  5. MySQL最全存储引擎、索引使用及SQL优化的实践

    1 MySQL的体系结构概述 整个MySQL Server由以下组成 :Connection Pool :连接池组件Management Services & Utilities :管理服务和 ...

  6. 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

    MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...

  7. MySQL存储引擎【InnoDB、MyISAM、Memory】

    数据库,MySQL这样存在多存储引擎的数据库软件,清楚常见的存储引擎的区别,使用合适的存储引擎,使得项目跑的更顺畅,有时候对于一个项目,甚至比项目本身都重要.这篇文章,旨在浅谈常见的三种存储引擎的区别 ...

  8. mysql 存储引擎 myisam innodb 区别

    虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了.可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引 ...

  9. MySQL两种存储引擎: MyISAM和InnoDB

    MySQL两种存储引擎: MyISAM和InnoDB 简单总结   MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Me ...

  10. MySql的多存储引擎架构, 默认的引擎InnoDB与 MYISAM的区别(滴滴)

    1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

随机推荐

  1. 一键生成项目 SpringBoot+MyBatis代码生成器 支持Oracle MySQL PostgreSQL

    下载地址 https://github.com/lxw112190/lxw_Helper 如果觉得github下载慢的,可以加我QQ(819069052)我发给你,或者加QQ交流群:758616458 ...

  2. WPF实现树形下拉列表框(TreeComboBox)

    前言 树形下拉菜单是许多WPF应用程序中常见的用户界面元素,它能够以分层的方式展示数据,提供更好的用户体验.本文将深入探讨如何基于WPF创建一个可定制的树形下拉菜单控件,涵盖从原理到实际实现的关键步骤 ...

  3. Codeforces Round #726 (Div. 2)

    CF1537A Arithmetic Array 洛谷传送门 CF1537A 分析 用这 \(n\) 个数的总和 \(sum\) 判断: 如果 \(sum<n\) 直接用 \(n-sum+1\) ...

  4. #线段树#LOJ 6029「雅礼集训 2017 Day1」市场

    题目 在长度为\(n(n\leq 10^5)\)的数列中, 需要满足区间加,区间下取整的操作 以及能够查询区间和以及区间最小值 除数\(d\)满足\(2\leq d\leq 10^9\) 加数\(c\ ...

  5. 快捷转换/互转 Markdown 文档和 TypeScript/TypeDoc 注释

    背景 作为文档工具人,经常需要把代码里面的注释转换成语义化的 Markdown 文档,有时也需要进行反向操作.以前是写正则表达式全局匹配,时间长了这种方式也变得繁琐乏味.所以写了脚本来互转,增加一些便 ...

  6. 战码先锋直播预告丨参与文档贡献,开启OpenHarmony社区贡献之旅

    OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」(本期OpenHarmony开源贡献者计划以 ...

  7. Java 构造函数与修饰符详解:初始化对象与控制权限

    Java 构造函数 Java 构造函数 是一种特殊的类方法,用于在创建对象时初始化对象的属性.它与类名相同,并且没有返回值类型. 构造函数的作用: 为对象的属性设置初始值 执行必要的初始化操作 提供创 ...

  8. Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.用git --version命令检查是否已经安装 二.下载git源码并解压 wget https://github.com/git/ ...

  9. 深入解析C++的auto自动类型推导

    关键字auto在C++98中的语义是定义一个自动生命周期的变量,但因为定义的变量默认就是自动变量,因此这个关键字几乎没有人使用.于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变 ...

  10. DevEco Studio 3.1 Beta新特性知多少

     原文链接:https://mp.weixin.qq.com/s/HYdNlKKA9Z51dfI1bcplDA,点击链接查看更多技术内容: DevEco Studio 3.1 Beta新特性知多少原文 ...