不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。同一个数据库中,不同的表可以有不同的引擎。
(1)InnoDB引擎
- MySQL5.5.8及其之后的默认引擎
- 支持事务(提交、回滚、崩溃恢复),表锁,行锁,外键
- 支持非锁定读,即默认读取操作不会产生锁
- 每张表的数据存储按照主键顺序存放,若没有指定主键,InnoDB会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形
- 表和索引存储在一个逻辑空间中
- 不保存表数据的总记录数,执行select count( * ) from table时需要全表扫描
使用场景
被用在众多需要高性能、支持事务、外键等的大型数据库上
(2)MyISAM引擎
- 拥有较高的插入、查询效率
- 不支持事务、外键
- 只支持表锁
- 索引文件和数据文件分开存储
- 用一个变量保存了整个表的记录总数,执行select count( * ) from table时只需要取出改值即可
- 可以没有主键
- 表锁机制降低了读写吞吐量,在CPU核数增加时,InnoDB的吞吐量更好
使用场景
OLAP:联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。
(3)MEMORY引擎
- 将表中的数据存储到内存中,提高查询效率。如果数据库重启或者崩溃,表中的数据丢失。
- 要求存储在Memory数据表里的数据用的是长度不变的格式,这意味着不能用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。
- MySQL数据库中使用Memory存储引擎作为临时表来存放查询的中间结果集,如果中间结果集大于Memory存储引擎表的容量设置,又或者中间结果集含有text和blob字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。因为MyISAM不会缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
使用场景
- 数据量小,而且被非常频繁地访问
- 数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中
- 存储在Memory表中的数据如突然丢失,不会对应用服务产生实质的负面影响
(4)MERGE引擎
MERGE存储引擎是一组MyISAM表组合,这些MyISAM表结构必须完全相同,尽管使用不如其它引擎突出,但是在某些情况下非常有用。说白了Merge表就是几个相同MyISAM表的聚合;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。
使用场景
对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定时间相关。例如:可以用12个相同的表来存储服务器的日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表时,这意味着需要编写、更新多表查询,以反映这些表中的信息。与其编写这些可能会出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表而不影响原来的数据,删除Merge表只会删除掉Merge表的定义,对内部表没有任何影响。
(5)ARCHIVE引擎
- Archive就是归档的意思,在归档之后很多的高级功能就不再支持了,仅支持最基本的插入和查询两种功能。在MySQL 5.1版前,Archive不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库、日志信息使用。
- 提供高速的插入和压缩功能。