本篇内容包括:MySQL 引擎简介、InnoDB与MyISAM存储引擎之间的比较以及其他常用引擎。
一、MySQL 引擎简介
存储引擎是数据库的核心,MySQL的存储引擎架构被设计为可插拔式架构模式,也就是在不影响任何业务逻辑的情况下,我们可以随时替换当前的存储引擎,以达到以存储和性能方面的需求。
MySQL的Server层与存储引擎层通过MySQL服务器提供统一的API接口与存储引擎进行交互,Server不关心底层存储引擎的实现细节,而不同的存储引擎对数据的存储与处理、查询都有自己的实现。
虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种:MyISAM、InnoDB、MEMORY、ARCHIVE
查看存储引擎:MySQL支持多种存储引擎,如果我们想查看自己的MySQL服务器支持多少种存储引擎,可以使用SHOW ENGINES命令进行查询,如:mysql> SHOW ENGINES;
1、InnoDB
InnoDB存储引擎在 MySQL5.6 版本以上被作为默认引擎,支持行级锁定、MVCC 多版本控制、非锁定读、事务、外健等特性,对事务的支持,让 MySQL 成为更加完善的数据库管理系统系统,行级锁定使 InnoDB 可以支持更大的并发数。
一般来说,如果没有什么其他特殊的需求,InnoDB 存储引擎是使用 MySQL 创建数据表的首选。
2、MyISAM
在 MySQL5.1 以前,MyISAM 存储引擎是 MySQL 是默认存储引擎,MyISAM 支持表级锁定,并不支持事务,比较适合大量的select和insert操作。
二、InnoDB与MyISAM存储引擎之间的比较
1、事务的支持
InnoDB 支持 ACID 的事务处理,MyISAM 并不支持事务,这里需要注意,如果我们在程序需要进行事务处理,所有的数据都要使用Innodb存储引擎,如果中间有MyISAM存储引擎的数据表,如果进行事务回滚,MyISAM并不会回滚到之前的状态,因此MyISAM不支持事务。
2、索引与主键处理
InnoDB 存储引擎使用的是聚集索引,InnoDB 主键的叶子节点是该行的数据,而其他索引则指向主键,而 MyISAM 存储引擎使用的是非聚集索引,主键与其他索引的叶子节点都存储了指向数据的指针。
另外一个是MyISAM数据表允许没有主键和其他索引,而InnoDB数据表如果没有主键的话,而会生成一个用户不可见6字节的主键。
3、外键
MyISAM不支持外键,而Innodb则支持建立数据表之间的外键关联。
4、存储文件的不同
Innodb 存储文件有 frm、ibd,而 MyISAM 是 frm、MYD、MYI,Innodb 存储文件中 frm 是数据表结构定义文件,ibd 是数据文件,MyISAM中frm是数据表结构定义文件,MYD是数据的文件,MYI则是存储索引的文件。
5、select count(*)
使用 MyISAM 存储引擎的数据表会记录一个数据表的总行数,所以对使用MyISAM存储引擎的数据表进行select count(*),可以很快得到一个数据表的总行数,而对于InnoDB存储引擎的数据表,想要查询总行数需要进行全表扫描才能得到。
6、锁的级别
InnoDB 支持行级锁,而 MyISAM 只支持表级锁,因此 InnoDB 更能支持高并发。
三、其他常用引擎
1、MEMORY
MEMORY:使用 MEMORY 引擎主要是因为速度,好处就在 MEMORY 采用的逻辑存储是系统内存,极大的提高了储存数据表的性能;
坏处就是当 mysqld 守护进程崩溃时,所有的 Memory 数据都会丢失。
要求存储在 Memory 数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型
所以一般在以下几种情况下使用Memory存储引擎:
- 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数 max_heap_table_size 控制 Memory 表的大小,设置此参数,就可以限制 Memory 表的最大大小。
- 如果数据是临时的,而且必须立即使用,那么就可以存放在内存表中。
- 存储在 Memory 表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。
Memory 同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在 order by 子句中
2、MERGE
MERGE 存储引擎是一组 MyISAM 表的组合,这些 MyISAM 表结构必须完全相同,所以就相当于一个集合器。比起其他储存引擎MERGE 不是很优秀,但是在某些情况下 MERGE 还是非常的有用。对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。
3、ARCHIVE
Archive 是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在 MySQL 5.5 版以前,Archive 是不支持索引,但是在 MySQL 5.5 以后的版本就开始支持索引了。Archive 拥有很好的压缩机制,它使用 zlib 压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。