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

    文章

    107

    浏览量

    33362
  • MySQL
    +关注

    关注

    1

    文章

    775

    浏览量

    26006
  • Hash
    +关注

    关注

    0

    文章

    32

    浏览量

    13105
  • MVCC
    +关注

    关注

    0

    文章

    13

    浏览量

    1437

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    mysql

    本帖最后由 开开2016 于 2016-8-10 10:20 编辑 现在有个问题请教下大家,用labview连mysql时不知字符串如何,谁用过指点下,是服务器上的Mysql,地址等信息在图中
    发表于 08-10 10:19

    0基础学Mysql:mysql入门视频教程!

    0基础学Mysql:mysql入门视频教程!目前MySQL技术虽然在国内发展了许多年,但是直都没有形成个专门的学科,
    发表于 07-08 10:51

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

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

    详解Mysql数据库InnoDB存储引擎事务

    关于Mysql数据库InnoDB存储引擎事务的点理解
    发表于 05-13 10:11

    mysql的存储引擎选择方法

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

    MySQL存储引擎简析

    MySQL存储引擎InnoDB  InnoDB 的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而.idb是数据文件。InnoDB 中存在表锁和行锁,不过行锁是在命中
    发表于 09-06 06:07

    STM32串口配置代码常见问题是什么?

    STM32串口配置代码常见问题是什么?
    发表于 11-18 07:39

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

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

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

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

    MySQL存储引擎中MyISAM与InnoDB优劣势比较分析

    使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都会看到。
    的头像 发表于 07-18 16:00 2513次阅读
    <b class='flag-5'>MySQL</b>存储<b class='flag-5'>引擎</b>中MyISAM与InnoDB优劣势比较分析

    MySQL存储引擎中MyISAM与InnoDB优劣势比较分析

    使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都会看到。
    的头像 发表于 07-18 16:00 3417次阅读
    <b class='flag-5'>MySQL</b>存储<b class='flag-5'>引擎</b>中MyISAM与InnoDB优劣势比较分析

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

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

    关于mysql存储引擎你知道多少

    Mysql中用的最多的两种存储引擎就是MyISAM和InnDB,其中MyISAM是5.1版本之前的默认存储引擎,InnoDB是5.1版本之后的默认存储引擎
    发表于 08-23 10:52 736次阅读

    有哪些不同的MySQL数据库引擎

    数据库引擎MySQL组件,可以处理SQL操作,例如从数据库创建、读取和更新数据。MySQL中有两种类型的引擎:事务性和非事务性。
    的头像 发表于 04-03 16:38 914次阅读