简单介绍一下 Mysql 存储引擎

news/发布时间2024/5/21 18:01:21

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 日志文件

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Wpf经验技巧-使用 d:DataContext 指定 DataContext 的类型.

VM代码:V代码(版本1): 没有指定DataContext的类型, 所以下面的绑定并不知道P1和P3到底是什么, 也就无法在代码编辑时检测出绑定是否正确. 如果写错了,只能等到程序运行并打开这个窗口时报错才能知道.V代码(版本2): 通过d:DataContext指定了DataContext的类型, 所以下面的绑定可…

VMware ESXi 7.0 Update 3o 下载 - 领先的裸机 Hypervisor (重大更新)

VMware ESXi 7.0 Update 3o 下载 - 领先的裸机 Hypervisor (重大更新)VMware ESXi 7.0 Update 3o 下载 - 领先的裸机 Hypervisor (重大更新) VMware ESXi 7.0 Update 3o Standard & All Custom Image for ESXi 7.0 U3 Install CD 新增了 22 个服务器机型(Dell、HPE 和 Len…

Servlet作用域对象

一、Servlet三大域对象1、Request(HttpServletRequest):生命周期: 创建:客户端向服务器发送一次请求,服务器就会创建request对象 销毁:服务器对这次请求作出响应后就会销毁request对象 有效:仅在当前请求中有效,如果web组件之间需要共享同一个请求中的数据,只能使用请求…

java——mysql随笔——运维——分库分表MyCat

分库分表: 介绍: 拆分方式:11 11

使用J4125主机搭建个人微型服务器

对于个人开发者而言,一个稳定可靠的服务器通常是不可或缺的。然而,云服务器的价格却让许多人望而却步。我曾通过白嫖阿里云服务提供给学生的六个月(?)免费公网服务器搭建WEB服务,在其已然过期许久的今天,我选择了一个经济且足够运行虚拟化的解决方案——搭载J4125的CPU小…