您的位置 首页 > 娱乐休闲

MySQL存储引擎详解

本文主要讲解MySQL常用的存储引擎,以及之间的显著特点和区别。Verchielxy 原创,转载注明出处。

MySQL的简介

MySQL数据库是一款关系型数据库,原型最早由瑞典一件公司开发而成,后来被Oracle收购,截止目前为止,仍然是一款开源的数据库。

由于Oracle已经收购,所以目前MySQL仍然存在闭源的风险,所以衍生出其他给予MySQL的分支版本,mariadb就是其中之一。

什么是存储引擎

存储引擎是相对于关系型数据库里面的表而言的。换句话说,你可以理解,表为一辆汽车,那么引擎就是发动机,决定汽车的动力。 但是这里又有一点不同,就是发动机的速度,不是决定一辆车好坏的唯一判别方式。同样的,存储引擎也是如此。

根据不同的使用场景需求,选择不同的存储引擎,这是一个良好开发的起点。

MySQL存储引擎分类

下面的代码可以看到有种存储引擎

show engines;

MySQL存储引擎有一共有8种

  • MyISAM

  • InnoDB

  • MRG_MYISAM

  • MEMORY

  • ARCHIVE

  • BLACKHOLE

  • CSV

  • FEDERATED

重要提示

下面我们谈一谈常见的几种存储引擎,由于不同的MySQL版本对于很多细节方面的不同,造成的差异性很大, 这里我们以MySQL的5.6版本为主来讨论。

MyISAM存储引擎详解

MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;

每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名。

例如,我建立了一个MyISAM引擎的example表,那么就会生成以下三个文件:

  • exam,存储表定义;

  • exam,存储数据;

  • exam,存储索引。

最重要的一点,MyISAM表是无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。

也正是因为不支持事务,所以MyISAM的读取速度是非常的快的,适合大数据量的read操作。

MyISAM一般性特点如下:

  • MyISAM存储引擎在筛选大量数据时非常迅速

  • MyISAM的并发插入特性允许同时选择和插入数据

InnoDB存储引擎详解

MySQL 5.5、5.6默认的存储引擎。

InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。

InnoDB表类型基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB

这里要提到的最重要的一点就是,它支持事务。例如:一个高并发的量的商城网站,在同一时刻,要在不同的 表当中就插入数据,而这些数据之间有有关系,这个时候事务起到了决定性的作用。通俗理解起来就是, 要么一起操作成功,要么一起操作失败。

支持事务,能帮助很多应用解决了数据关联方面的棘手问题。

对于事务你要了解

ACID 事务

  • A 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行。也就是说一个事务不可能只执行了一半就停止了。比如你从取款机取钱,这个事务可以分成两个步骤:1)划卡,2)出钱。不可能划了卡,而钱却没出来,这两步必须同时完成,要么就不完成。

  • C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。

  • I 独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致。

  • D 持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

MyISAM和InnoDB存储引擎的差别

对于锁

  • MyISAM - 表锁

  • InnoDB - 表锁、行锁 注意:InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like '%aaa%'

对于不带where条件的count (select count(*) form table)

  • MyISAM - 只要简单的读出保存好的行数

  • InnoDB - 不保存表的具体行数,需要遍历整个表

对于AUTO_INCREMENT

  • MyISAM - 每表一个AUTO_INCREMEN列的内部处理,可用ALTER TABLE或myisamch来重置,对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引

  • InnoDB - 自动增长计数器仅被存储在主内存中,而不是存在磁盘上, 如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值

对于事务

  • MyISAM - 不支持事务

  • InnoDB - 支持事务

对于外键

  • MyISAM - 不支持外键

  • InnoDB - 支持外键

构成上的区别

  • MyISAM - 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

  • InnoDB - 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB

对于全文索引

  • MyISAM - 支持全文索引

  • InnoDB - 不支持全文索引

  • 对于 MySQL 5.6.4以上版本, InnoDB 支持英文全文索引,可以通过使用Sphinx从InnoDB中获得全文索引

MRG_MYISAM存储引擎

MRG_MYISAM存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。Merge存储引擎的使用场景。

MEMORY存储引擎

Memory 是内存级别存储引擎,数据存储在内存中,所以他能够存储的数据量较小。

因为内存的特性,存储引擎对数据的一致性支持较差。锁级别为表锁,不支持事务。但访问速度非常快,并且默认使用 hash 索引。

Memory存储引擎使用存在内存中的内容来创建表,每个Memory表只实际对应一个磁盘文件,在磁盘中表现为.frm文件。

ARCHIVE存储引擎

这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。

全部资料来源于google,MySQL官方文档,英文和中文博客,由verchielxy翻译整理而成。感谢这些作者为开发者提供的宝贵资料。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“mysql如何存储汉字,mysql存储汉字用什么数据类型,mysql中存汉字为什么是问号,mysql汉字用什么类型”边界阅读