MySQL之存储引擎

MySQL知识总结之(存储引擎层)

1.四种存储引擎

大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。
比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选择
引擎的时候,需要在合适的场景,选择合适的存储引擎,就像在直升机上,我们不能选择舰载机的引擎
一样。
而对于存储引擎,也是一样,他是mysql数据库的核心,我们也需要在合适的场景选择合适的存储引
擎。接下来就来介绍一下存储引擎。

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是
基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果
没有指定将自动选择默认的存储引擎。

MySQL中常用的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB;
不同的存储引擎没有好坏之分呢,只有在不同的场景使用不同的引擎

2.InnoDB存储引擎

2.1介绍

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的事务型存储引擎,使用最广泛,基于聚簇索引建立的。InnoDB内部做了很多优化,如能够自动在内存中创建自适应hash索引,以加速读操作。

2.2优缺点

优点:
*DML操作遵循ACID模型,支持事务和崩溃修复能力;
*引入了行级锁,提高并发访问性能;
支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
缺点:占用的数据空间相对较大。

2.3表空间文件

xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,xxx.ibd里面存储该表的"表结构"数据、“表中数据”、数据涉及到的索引
早期的"表结构"数据都存储在另一个frm文件里 ;但是8.0之后都存在sdi字典里,sdi融入到了ibd文件里
即早期的InnoDB 的表空间文件为:ibd 和 frm(表结构定义)

2.4查看表空间文件

在这里插入图片描述
在这里插入图片描述

注意:不能直接打开account.ibd来查看,因为都是二进制的,必须得用一下指令来看
account.ibd文件中不仅存放表结构、数据,还会存放该表对应的索引信息。
而该文件是基于二进制存储的,不能直接基于记事本打开,我们可以使用mysql提供的一个指令 ibd2sdi ,从idb这个文件中提取sdi表结构数据而,通过该指令就可以从ibd文件中提取sdi信息,而sdi数据字典信息中就包含该表的表结构。
ibd2sdi account.ibd
显示出来很多json数据,表的字段

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.5查看参数开关

参数:innodb_file_per_table
这个参数决定了所有的表共享一个表空间文件还是每一个表都对应一个表空间文件
Mysql8.0版本后这个开关都是默认打开的,即说明每一个表都对应一个表空间文件

on代表开着的,即说明每一个表都对应一个表空间文件

show variables like 'innodb_file_per_table';

在这里插入图片描述

2.6特点

自从 MySQL5.1 之后,默认的存储引擎变成了 InnoDB 存储引擎,相对于MylSAM,InnoDB 存储引擎有了较大的改变,它的主要特点是:
(1)支持事务操作,具有事务 ACID 隔离特性,默认的隔离级别是可重复读(repetable-read)、通过 MVCC(并发版本控制)来实现的。能够解决 脏读和 不可重复读 的问题。 InnoDB 支持外键操作
(2) InnoDB 默认的锁粒度行级锁,并发性能比较好,会发生死锁的情况。
(3)和MyISAM 一样的是,InnoDB 存储引擎也有 frm 文件存储表结构定义,但是不同的是,InnoDB 的表数据与索引数据是存储在一起的,都位于 B+数的叶子节点上,而 MylSAM 的表数据和索引数据是分开的
(4)InnoDB 有安全的日志文件,这个日志文件用于恢复因数据库崩溃或其他情况导致的数据丢失问题,保证数据的一致性
(5)InnoDB 和 MylSAM 支持的索引类型相同,但具体实现因为文件结构的不同有很大差异
(6)增删改查性能方面,果执行大量的增删改操作,推荐使用 InnoDB 存储引擎,它在删除操作时是对行删除,不会重建表

3.MyISAM存储引擎

3.1介绍

MyISAM是MySQL早期的默认存储引擎,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,可以使用MyISAM引擎。MyISAM会将表存储在两个文件中,数据文件.MYD和索引文件.MYI

3.2优缺点

优点:
*访问速度快。
缺点:
*MyISAM不支持事务
*支持表锁,不支持行级锁,
*不支持崩溃后的安全恢复
*也不支持外键

3.3文件

xxx.sdi:存储表结构信息
xxx.MYD: 存储数据
xxx.MYI: 存储索引

sdi文件可以直接用notepad打开,里面时json格式的数据,里面有很多表的字段等等信息

在这里插入图片描述

在这里插入图片描述

注:早期的MyISAM 的表文件包括:frm(表结构定义),.MYI(索引),.MYD(数据)
每个 MyISAM 表格以三种格式存储在磁盘上:
*“.frm”文件 存储表定义
*数据文件具有“.MYD”(MYData)扩展名
*索引文件具有“.MYI”(MYIndex)扩展名

3.4特点

在 5.1 版本之前,MyISAM 是 MySQL 的默认存储引擎,MylSAM 并发性比较差,使用的场景比较少主要特点是:
(1)不支持事务操作,ACID 的特性也就不存在了,这一设计是为了性能和效率考虑的
(2)不支持外键操作,如果强行增加外键,MySQL 不会报错,只不过外键不起作用
(3)MyISAM 默认的锁粒度是表级锁,所以并发性能比较差,加锁比较快,锁冲突比较少,不太容易发生死锁的情况
(4)MyISAM 会在磁盘上存储三个文件,文件名和表名相同,扩展名分别是sdi(存储结构信息)、MYD(MYData,存储数据)、MYI(MyIndex,存储索引)。这里需要特别注意的是 MyISAM 只缓存 索引文件,并不缓存数据文件。
(5)MyISAM 支持的索引类型有全局索引(Full-Text)、B+Tree 索引、R-Tree 索引
*Full-Text 索引:它的出现是为了解决针对文本的模糊查询效率较低的问题
*B+Tree 索引:所有的索引节点都按照平衡树的数据结构来存储,所有的索引数据节点都在叶节点
*R-Tree 索引:它的存储方式和 B-Tree 索引有一些区别,主要设计用于存储空间和多维数据的字段做索引,目前的 MySQL 版本仅支持 geometry类型的字段作索引,相对于 BTREE,RTREE 的优势在于范围查找
(6)数据库所在主机如果宕机,MyISAM 的数据文件容易损坏,而且难以恢复。
(7)增删改查性能方面:SELECT 性能较高,适用于查询较多的情况

4.MEMORY存储引擎

4.1介绍

MEMORY引擎将b表数据全部放在内存中,访问速度较快,但是由于受到硬件问题、或断电问题的影响,一旦系统奔溃的话,数据都会丢失,只能将这些表作为临时表或缓存使用。
MEMORY引擎默认使用哈希索引,将键的哈希值和指向数据行的指针保存在哈希索引中。

4.2优缺点

优点:
访问速度较快
缺点:
1.哈希索引数据不是按照索引值顺序存储,无法用于排序。
2.不支持部分索引匹配查找,因为哈希索引是使用索引列的全部内容来计算哈希值的。
3.只支持等值比较,不支持范围查询。
4.当出现哈希冲突时,存储引擎需要遍历链表中所有的行指针,逐行进行比较,直到找到符合条件的行。

4.3文件

xxx.sdi:存储表结构信息

5.ARCHIVE存储引擎

5.1介绍

ARCHIVE存储引擎非常适合存储大量独立的、作为历史记录的数据。

5.2优缺点

ARCHIVE提供了压缩功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差。

6.查询当前表所用引擎

我们可以看到,创建表时,即使我们没有指定存储疫情,数据库也会自动选择默认的存储引擎。
AUTO_INCREMENT=3 代表的是插入一条数据时候申请的的id
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci : 是uft8mb4字符集以及它的排序方式

show create table account;

在这里插入图片描述

7.建表时指定存储引擎(MyISAM存储引擎)

create table my_myisam(
id int,
name varchar(10)
) engine = MyISAM ;

在这里插入图片描述

在这里插入图片描述

8.建表时指定存储引擎(Memory存储引擎)

create table my_memory(
id int,
name varchar(10)
) engine = Memory ;

在这里插入图片描述

9.查询当前数据库支持的存储引擎

Supports transactions:支持事务
row-levle locking:行级锁
and foregin keys :支持外键
stored in memory :存储在内存当中
useful for temorary tables:通常用来做临时表即缓存

show engines;

在这里插入图片描述

10.InnoDB、MyISAM、Memory区别及特点

在这里插入图片描述
在这里插入图片描述

MySQL 存储引擎 MyISAM 与 InnoDB 区别
MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive 等等.在大多数的情况下,直接选择使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。
(1)锁粒度方面:
MyISAM 采用表级锁(table-level locking);InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
由于锁粒度不同,InnoDB 比 MyISAM 支持更高的并发;InnoDB 的锁粒度为行锁、MyISAM 的锁粒度为表锁,行锁需要对每一行进行加锁,所以锁的开销更大,但是能解决脏读和不可重复读的问题,相对来说也更容易发生死锁
(2)可恢复性上:
InnoDB 支持事务,MyISAM 不支持
由于 InnoDB 是有事务日志的,所以在产生由于数据库崩溃等条件后,可以根据日志文件进行恢复;而 MyISAM 则没有事务日志。
InnoDB支持MVCC, 而MyISAM不支持。
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
(3)查询性能上:MylSAM 要优于 InnoDB 因为 InnoDB 在查询过程中,是需要维护数据缓存,而且查询过程是先定位到行所在的数据块,然后在从数据块中定位到要查找的行;而 MyISAM 可以直接定位到数据所在的内存地址,可以直接找到数据
(4)表结构文件上:MyISAM 的表结构文件包括:frm(表结构定义),.MYI(索引),.MYD(数据);而 InnoDB 的表数据文件为:ibd 和 frm(表结构定义)
(5)5.6版本之前,Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;
(6)InnoDB 不保存表的具体行数,MyISAM 用一个变量保存了整个表的行数。
(7)- InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
(8)InnoDB 支持外键,而 MyISAM 不支持

11.选择引擎(应用场景)

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。
InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,并且有较高的并发读写频率,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
MyISAM : 对事务完整性没有要求;表的数据都会只读的。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值