首页 > 数据库 >简单介绍一下 Mysql 存储引擎

简单介绍一下 Mysql 存储引擎

时间:2023-10-04 16:57:06浏览次数:36  
标签:存储 No 数据库 索引 引擎 InnoDB Mysql

1 入门

本文去浅浅的探讨一下 mysql 数据库的存储引擎。

数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。

现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。

首先你可以查看一下你的数据库所支持的存储引擎有哪些?

show engines;
image-20220418095539472

这就是我的数据库所支持的存储引擎。

2 选择

不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。

功能 MylSAM MEMORY InnoDB Archive
存储限制 256TB RAM 64TB None
支持事务 No No Yes No
支持全文索引 Yes No No No
支持树索引 Yes Yes Yes No
支持哈希索引 No Yes No No
支持数据缓存 No N/A Yes No
支持外键 No No Yes No

可以根据以下的原则来选择 MySQL 存储引擎:

  • 如果要提供提交、回滚和恢复的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 是一个很好的选择。
  • 如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。
  • 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果。
  • 如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。

提示:使用哪一种引擎要根据需要灵活选择,一个数据库中多个表可以使用不同的引擎以满足各种性能和实际需求。使用合适的存储引擎将会提高整个数据库的性能。

3 默认

mysql数据库 5.7 版本开始,默认存储引擎为 InnoDB。

同时也可以通过数据库语句进行设置默认存储引擎。

SET default_storage_engine=< 存储引擎名 >

但是这种设置在重启客户端后会失效

3.1 InnoDB 究竟有什么优势?

1)支持事务安装

InnoDB 最重要的一点就是支持事务,可以说这是 InnoDB 成为 MySQL 中最流行的存储引擎的一个非常重要的原因。InnoDB 还实现了 SQL92 标准所定义的 4 个隔离级别(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ 和 SERIALIZABLE)。

InnoDB 对事务安全的支持,让很多之前因为特殊业务而放弃使用 MySQL 的用户转向支持 MySQL。以及对数据库选型持观望态度的用户来说,也大大增加了对 MySQL 的好感。

2)灾难恢复性好

InnoDB 通过 commit、rollback、crash-recovery 来保障数据的安全。

具体来说,crash-recovery 就是指如果服务器因为硬件或软件的问题而崩溃,不管当时数据是怎样的状态,在重启 MySQL 后,InnoDB 都会自动恢复到发生崩溃之前的状态,并回到用户离开的地方。

3)使用行级锁

InnoDB 改变了 MyISAM 的锁机制,实现了行锁。虽然 InnoDB 的行锁机制是通过索引来完成的,但毕竟在数据库中 99%的 SQL 语句都要使用索引来检索数据。行锁定机制也为 InnoDB 在承受高并发压力的环境下增强了不小的竞争力。

在 SQL 查询中可以自由地将 InnoDB 类型的表与其他类型的表混合起来,甚至在同一个查询中也可以混合。

4)实现了缓冲处理

InnoDB 提供了专门的缓存池,实现了缓冲管理,不仅能缓冲索引也能缓冲数据,常用的数据可以直接从内存中处理,比从磁盘获取数据处理速度要快。相比之下,MyISAM 只是缓存了索引。

InnoDB 的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被保存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。

5)支持外键

InnoDB 支持外键约束,检查外键、插入、更新和删除,以确保数据的完整性。在存储表中数据时每张表的存储都按主键顺序存放,如果没有显式地在定义表时指定主键,InnoDB 会为每一行生成一个 6 字节的 ROWID ,并以此作为主键。

InnoDB 实现外键引用这一重要特性,使在数据库端控制部分数据的完整性成为可能。虽然很多数据库系统调优专家都建议不要这样做,但是对于不少用户来说,大部分情况下,在数据库端加外键控制仍然是成本最低的选择。

6)适合需要大型数据库的网站

InnoDB 被用在众多需要高性能的大型数据库网站上。

InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。

除了以上几个亮点之外,InnoDB 常常还有很多其它的功能特色带给使用者惊喜。当然,使用 InnoDB 存储引擎肯定也有缺点。相对于其它存储引擎来说,使用 InnoDB 存储引擎的读写效率稍差,且占用的数据空间相对较大。

3.2 存储

InnoDB 存储引擎的存储,会在磁盘上生成一个 ibd 文件,

3.2.1 数据文件

数据文件用来存放数据表中的数据和所有的索引数据,包括主键和其他普通索引。

InnoDB 存储的数据采用表空间(Tablepace)进行存放设计。表空间是用来存放 MySQL 系统相关信息的一个特殊共享表空间。

InnoDB 的表空间分为以下两种形式:

  1. 共享表空间,表数据和索引都存放在同一个表空间。默认的表空间文件就是上面所提到的 MySQL 初始化路径下的 ibdata1 文件。
  2. 独立表空间,每个表的数据和索引被存放在一个单独的 .ibd 文件中。

可以通过一下命令去查看 mysql 是否使用了独立表空间

-- 此处 ON 为开启,OFF为关闭 8.0版本开始默认打开
SHOW VARIABLES LIKE 'innodb_file_per_table%';  

3.2.1.1 共享表空间

3.2.1.2 独立表空间

独立表空间默认为开启,但是也可以通过命令进行相关设置

-- 1 为开 0 为关
SET GLOBAL innodb_file_per_table=1;

需要注意的是,单独的表空间文件只存储该表的数据、索引和缓冲等信息。所以无论是使用共享表空间还是独享表空间来存放表,共享表空间都是必须存在的。

3.2.2 日志文件

标签:存储,No,数据库,索引,引擎,InnoDB,Mysql
From: https://www.cnblogs.com/shenzizai/p/17742440.html

相关文章

  • Docker搭建Mysql主从机制
    Mysql主从复制1基础准备由于家境贫寒没有那么多的云资源供我操作,只能使用docker进行模拟了。拉取镜像简单得很就先不谈了。直接开整。以下操作基于mysql:5.7进行一主二从配置。2主库配置运行容器dockerrun-p3306:3306--namemysql-slaver-2-eMYSQL_ROOT_PASSWOR......
  • Mysql - 函数
    目录字符串函数数值函数日期函数字符串函数案例:企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0,比如:1号员工的工号应该为00001updateempsetworkno=LPAD(workno,5,'0');效果:需要注意的是workno需要是varchar类型数值函数案例:通过数据库的函数,生成一个6位......
  • IntelliJ IDEA 解决连接MYSQL失败问题
    省流版:mysql-connector-java-8.0.13.jar应该出现在下面三个地方:①web-WEB-INF-lib②Database连接时(一般会自动下载)③apache-tomcat-8.0.32-lib 在自己的项目里找到web-WEB-INF-lib,检查一下有没有驱动包  如果没有mysql-connector-java-8.0.13.jar需要下载一个然后在F......
  • 2.MySQL的基本命令
    netstartmysql数据库重启netstopmysql强行停止数据库服务mysql-uroot-p进入数据库exit退出-u代表用户名,这之间可以用空格,空格也代表一个字符,但是仅对密码有效-p代表密码p后面如果跟空格也会算作一个字符......
  • java——mysql随笔——运维——分库分表&MyCat
    分库分表:                    介绍:                    拆分方式:                                     ......
  • Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-
    JDBC概述JDBC(JavaDatabaseConnectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一......
  • MySQL聚合函数及分组查询
    本文列举数据库的聚合函数及分组查询的实际使用,以员工表和部门表作为举例:部门表:dept点击查看创建部门表sqlcreate table `dept`  (  `deptno` int(2) not null,  `dname` varchar(14),  `loc` varchar(13),  primary key (`deptno`));员工表:emp点击查......
  • 文件上传和本地存储
    文件上传是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。文件上传前端页面三要素:①上传类型必须是file②提交方式必须是post③上传编码类型必须是multipart/form-data服务端接收文件形式: 在前端发送过请求后,服务端会接受数据并将数据存放在指......
  • MYSQL数据库基础
    目录1.数据库概念1.1数据库是干嘛的?1.2数据库和数据结构是啥关系?​1.3两种类型的数据库2.MySQL数据库2.1MySQL数据库概念2.2MySQL基本操作 2.2.1建立数据库 2.2.2查看数据库 2.2.3选中数据库 2.2.4删除数据库2.3MySQL数据类型1.数据库概念1.......
  • MySQL主键自增ID
    自增ID保存值MySQL8.0之前的AUTO_INCREMENT值保存在内存中,重启后会取最大的id+1作为值;MySQL8.0之后的值会保存在redolog中,支持崩溃恢复。自增ID不连续原因唯一键冲突插入失败事务中插入后回滚批量插入,执行插入sql时会按照2的n次方批量申请。若申请的值未能刚好用完,后续再......