我们都知道mysql支持了很多种存储引擎,那么它们之间有什么区别、我们又怎么选择呢?本文主要讲述了mysql常用的存储引擎的优缺点,以及它们各自的适用场景。
Mysql的存储引擎
- 查看数据库所支持的存储引擎指令为:show engines; 它可以使用’\g’或者’\G’或者’;‘结束。’\G’的结果更为美观一些
- 查询当前默认使用的存储引擎为 show variables like ‘%storage_engine%’;
InnoDB(B+)
优点
- 支持自动增长序列,AUTO——INCREMENT;非空唯一,为主键。
- 支持外键
- 提供良好的事务管理、崩溃修复能力与并发控制。
缺点
- 缺点是读写效率稍差,占用数据空间相对较大。
###应用场景
- 密集型表。InnoDB适合处理多重并发的更新请求;
- 事务。InnoDB是唯一支持事务标准的MySql存储引擎。
- 自动灾难恢复。能够自动回复,但是回复时间较长。
MyISAM(B+索引,索引与数据分离,索引只记录地址)
- 它是基于ISAM发展起来的。解决了许多不足
MyISAM存储的文件类型
- frm 存储表的结构
- MYD 存储数据,是MYData的缩写。
- MYI 存储索引,是MYIndex的缩写。
存储格式
- MyISAM静态。如果所有表列的大小都是静态的(即不使用xBLOB,xTEXT或VARCHAR数据类型),便会自动使用静态MYISAM格式。使用这种类型性能高,因为在维护和访问以预定义格式存储的数据开销很低。以空间换时间。
- MyISAM动态。如果有表列(即使只有一列)定义为动态。MySql自动使用动态格式。动态格式比静态格式所占空间少,但带来性能下降,以及当某个字段发生改变则位置移动会导致碎片的产生,数据集中碎片增加数据访问性能就会降低。有两种修复方式:第一:尽可能使用静态数据类型。第二:经常使用OPTIMIZE TABLE语句,它会整理表的碎片,恢复由于表更新和删除导致的空间丢失。
MyISAM压缩
- 有时候会创建在整个应用程序生命周期中都只读的表。这种情况下可以使用myisampack工具将其转化为MyISAM压缩表来减少空间。
MyISAM的优缺点
它的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性。
MEMORY存储引擎
MEMORY的文件存储格式
- 基于MEMORY的表实际对应一个磁盘文件。文件名与表名相同。类型为frm。该文件只存储表的结构,数据文件都存储在内存中。这十分有利于对数据的快速处理,提高表的的处理效率。但服务器需要有足够的内存。
MEMORY存储引擎的索引类型
- 它默认使用哈希索引,其速度优于B树索引。可以在创建时进行选择。
MEMORY的存储周期
- 它一般很少用到,因为它的数据存储在内存上,内存出现异常就会影响数据的完整性。重启机器或者关机会导致表中的数据消失。所以它的生命周期很短,一般是一次性的。
MEMORY的优缺点
- MEMORY的大小受到限制。取决于两个参数,max_rows 以及 max_heap_table_size;max_rows可以在建表时候使用,max_heap_table_size默认为16MB;
存储引擎的选择
每种存储引擎都有自己的优势,不能笼统的说谁比谁好,只有在某种场景下哪一个更合适。
InnoDB
关于InnoDB的使用,它用于事务处理应用程序, 具有众多的特性,包括ACID事务支持,支持外键,同时支持崩溃修复能力与并发控制。它更适用于对事务的完整性要求较高,实现并发控制。若需要频繁的更新、删除操作的数据库,也可以选择InnoDB。因为它可以实现事务的提交与回滚。
MyISAM
它适用于管理非事务表,他提供了告诉存储与检索以及全文搜索能力。MyISAM存储引擎插入数据快,空间和内存使用比较低。如果表主要用于插入新纪录和读出记录,它能实现处理的高效率。在应用对完整性与并发性要求低的情况下,也可以选择它。
MEMORY
MEMORY提供在内存中的表,它的所有数据都在内存中,数据的处理速度非常快,但是安全性较差。如果需要很快的读写速度,对数据的安全性要求低,那么它是最适合的。但是它也有一定的局限性,它对表的大小有限制,不能建立太大的表。