本文主要讲解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翻译整理而成。感谢这些作者为开发者提供的宝贵资料。