0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写一写MySQL常见的引擎

阿铭linux 来源:阿铭linux 2023-02-08 09:50 次阅读

本来这篇文档只想写Myisam和Innodb两个存储引擎的区别,毕竟这个话题也是面试中经常被问到的。但,Myisam存储引擎由于不支持事务以及不支持行级锁,用的人越来越少了。所以,干脆写一写MySQL常见的引擎吧。

什么是MySQL存储引擎

所谓存储,就是存数据的介质,而存储引擎就是一种存储数据的方式,就好比磁盘里的文件系统。不同的存储引擎,存储数据的方式不同,实现的功能点也不同。MySQL8.0默认的存储引擎为Innodb。

MySQL存储引擎都有哪些

在MySQL8里,可以执行show engines;来查看所有支持的存储引擎。

a1888970-a731-11ed-bfe3-dac502259ad0.png

查看某个表是什么存储引擎:

a198b750-a731-11ed-bfe3-dac502259ad0.png

不同的存储引擎都有各自的特点,以适应不同的需求,我只针对下面3个常见的存储引擎做出对比,如下表所示:

a1a6b1b6-a731-11ed-bfe3-dac502259ad0.png

MyISAM存储引擎

在MySQL5.5之前的版本,默认使用该存储引擎。若使用该存储引擎,每个表会在磁盘上存储成三个文件:

frm文件:存储表的定义数据

MYD文件:存放表具体记录的数据

MYI文件:存储索引

Frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。

支持数据的类型也有三种:

1)静态固定长度表

这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。

2)动态可变长表

优点是节省空间,但是一旦出错恢复起来比较麻烦。

3)压缩表

上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

MyISAM存储引擎有一个重要的特点那就是不支持事务,但是这也意味着它的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

InnoDB存储引擎

InnoDB是MySQL8.0版本默认的数据库存储引擎,他的主要特点有:

可以通过自动增长列,方法是auto_increment。

支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。

使用的锁粒度为行级锁,可以支持更高的并发;

支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。

配合一些热备工具可以支持在线热备份;

在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

当然InnoDB的存储表和索引也有下面两种形式:

使用共享表空间存储:所有的表和索引存放在同一个表空间中。

使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

Memory存储引擎

将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。Memroy存储引擎主要有以下特点:

支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

默认使用hash索引。

如果一个内部表很大,会转化为磁盘表。

MyISAM对比Innodb

再来做一个总结吧,面试中被问到,可以简单说说下面几个要点:

存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

存储空间

MyISAM支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。
InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了。

事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持、外部键等高级数据库功能。

是否支持行级锁

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是Innodb的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

是否支持聚集索引

MyISAM不支持聚集索引,InnoDB支持聚集索引。

外键

MyISAM:不支持
InnoDB:支持

全文索引

MyISAM支持 FULLTEXT类型的全文索引。
InnoDB不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

表主键

MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址。
对于InnoDB,如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见)。

表的行数

MyISAM保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了where条件后,MyISAM和InnoDB处理的方式都一样。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SAM
    SAM
    +关注

    关注

    0

    文章

    112

    浏览量

    33499
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26438
  • Hash
    +关注

    关注

    0

    文章

    32

    浏览量

    13188
  • MVCC
    +关注

    关注

    0

    文章

    13

    浏览量

    1461

原文标题:来聊聊MySQL的存储引擎

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    个登陆界面的程序框图,跪求高手帮忙一写

    个登陆界面的程序框图,跪求高手帮忙一写,好多控件找不到,麻烦大神写成程序框图,我邮箱1002435704@qq.com,麻烦了
    发表于 06-04 21:24

    功能全局变量储存事件引用,一写样请问是什么原因?

    本帖最后由 只耳朵怪 于 2018-5-29 09:00 编辑 功能全局变量储存事件引用 一写样 是有时候
    发表于 05-28 18:12

    mysql的存储引擎选择方法

    mysql怎么选择合适的存储引擎
    发表于 08-08 07:26

    在MCU开发中使用多线程操作一写读是否需要保护?

    在MCU(以常见的stm32为例)开发中使用多线程操作,我们经常遇到的问题是关于多线程访问数据的问题,多线程访问数据基本上可以分为几大类:多读多多读
    发表于 02-01 15:42

    keil软件一写空函数就显示目标没创建的原因?

    keil 软件 为啥我一写空函数就显示目标没创建?
    发表于 10-17 07:41

    基于三元Golay隐码的快速隐算法

    研究GF(3)上的编码方法,利用三元Golay码给出种GF(3)上的隐码,其隐性能较常见二元隐码有显著提高。提出基于三元Golay隐
    发表于 04-08 08:46 26次下载

    种具有分级安全的文本隐方法

    针对单数据类型隐方法安全性不高、隐容量不足等问题,提出了种具有分级安全的文本隐方法。首先,将整个载体文档中的多种类型的数据作为备选
    发表于 01-14 16:26 0次下载

    LSB匹配隐检测

    目前,在数字图像隐中,基于空域和频域隐的研究最为广泛。基于空域隐的研究起步较早,典型的隐方法如最不重要位(Least Significant Bit,LSB)替换隐
    发表于 02-23 09:55 2次下载

    什么是单片机烧软件?如何烧

    什么是单片机烧软件? 什么是单片机烧软件? 简单点说,就是把你写好代码(C或者是汇编)专程的机器语言通过定的方式下载到单片机中。称为烧。 烧
    发表于 04-14 11:04 3.4w次阅读

    对讲机频的常见问题及解决方案

    对讲机在使用过程中难免要修改和调整对讲机的频率,这个时候就需要按装频软件重新设置频率。今天小编就对讲机在频过程中会遇到的常见问题做了
    的头像 发表于 07-20 11:24 3.1w次阅读

    怎样选择存储引擎MySQL存储引擎怎么样?

    MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的“存储引擎”(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引擎
    的头像 发表于 09-02 10:15 4726次阅读

    三种常见的STM32单片机的烧方法

    三种常见的STM32单片机的烧方法
    发表于 05-28 09:57 34次下载

    stm32使用flymcu烧程序

    文章目录、使用flymcu烧程序、使用flymcu烧程序烧程序之前要使ASP指示灯保持强亮状态,同时要保证使flashIsp模式下
    发表于 10-26 11:06 18次下载
    stm32使用flymcu烧<b class='flag-5'>写</b>程序

    stm32单片机的命令与数据

    指令和数据,都是针对外部应用模块的,比如1 602液晶屏,命令是告诉液晶屏你要做什么,数据是把你要显示的数据送给液晶屏。
    发表于 11-19 09:21 7次下载
    stm32单片机的<b class='flag-5'>写</b>命令与<b class='flag-5'>写</b>数据

    来练习Redis部署的脚本

    继Nginx和MySQL的部署脚本之后,相信只要你跟着写了,那么里面的很多关键精髓你已经知晓,今天就来练习Redis部署的脚本吧。
    的头像 发表于 12-01 09:16 753次阅读