前言
在使用 MySQL 数据库管理系统时,选择一个合适的存储引擎是一个非常复杂的问题。不同的存储引擎都有各自的特性、优势和使用的场合,正确的选择存储引擎可以提高应用的使用效率。
存储引擎
为了能够正确地选择存储引擎,必须掌握各种存储引擎的特性。下面重点介绍几种常用的存储引擎,它们对各种特性的支持如下表所示。
特性 | MyISAM | Aria | InnoDB | MEMORY | CSV | BlackHole |
---|---|---|---|---|---|---|
存储限制 | 有 | 有 | 支持 | 有 | 有 | 无 |
事务安全 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | N/A |
锁机制 | 表锁 | 表锁 | 行锁 | 表锁 | N/A | N/A |
B树索引 | 支持 | 支持 | 支持 | 支持 | 不支持 | N/A |
哈希索引 | 不支持 | 不支持 | 不支持 | 支持 | 不支持 | N/A |
全文索引 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | N/A |
集群索引 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | N/A |
数据缓存 | 支持 | 支持 | 不支持 | N/A | ||
索引缓存 | 支持 | 支持 | 支持 | 支持 | 不支持 | N/A |
数据可压缩 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | N/A |
空间使用 | 低 | 低 | 高 | N/A | 高 | 无 |
内存使用 | 低 | 低 | 高 | 中等 | 高 | 无 |
批量插入速度 | 高 | 高 | 低 | 高 | 很低 | 很高 |
支持外键 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | 不支持 |
表中主要介绍了 MyISAM、InnoDB 和 MEMORY 三种存储引擎特性的对比。下面详细介绍这 3 个存储引擎的应用场合并给出相应的建议。
1) MyISAM
在 MySQL 5.1 版本及之前的版本,MyISAM 是默认的存储引擎。
MyISAM 存储引擎不支持事务和外键,所以访问速度比较快。如果应用主要以读取和写入为主,只有少量的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择 MyISAM 存储引擎是非常适合的。
MyISAM 是在 Web 数据仓储和其他应用环境下最常使用的存储引擎之一。
2) MGR_MyISAM
MERGE存储引擎,也被认识为MGR_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合,可以用来水平分表。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。表选项的差异,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
当你创建一个merge表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。这些表作为merge表自身,不必要在同一个数据库中。
你可以对表的集合用select, delete, update和insert。你必须对你映射到一个merge表的这些表有select, update和delete 的权限。
如果你drop merge表,你仅在移除merge规格。底层表没有受影响。
3) Aria
Aria引擎是MariaDB特有的,相比MyISAM有如下优点:
1. Aria的数据和索引具有崩溃恢复功能,如果发生崩溃,Aria会回滚到命令执行前的状态。
2. Aria能重放事务日志中的所有内容。但有些操作不能重放,比如load data infile、slect...insert等。
3. 支持对一张表的并发插入操作。
4. 当使用页格式时,数据缓存在页缓存中。
4) InnoDB
MySQL 5.5 版本之后默认的事务型引擎修改为 InnoDB。
InnoDB 存储引擎在事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比 MyISAM 存储引擎占用更多的磁盘空间。
如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。
InnoDB 存储引擎除了可以有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB 都是合适的选择。
5) MEMORY
MEMORY 存储引擎将所有数据保存在 RAM 中,所以该存储引擎的数据访问速度快,但是安全上没有保障。
MEMORY 对表的大小有限制,太大的表无法缓存在内存中。由于使用 MEMORY 存储引擎没有安全保障,所以要确保数据库异常终止后表中的数据可以恢复。
如果应用中涉及数据比较少,且需要进行快速访问,则适合使用 MEMORY 存储引擎。
6) CSV
数据以文本方式存储在文件中(Innodb则是二进制)
.CSV文件存储表内容
.CSM文件存储表的元数据如表状态和数据量
.frm文件存储表结构信息
CSV引擎限制
以CSV格式进行数据存储(逗号隔开,引号)
所有的列必须都是不能为NULL的
不支持索引(不适合大表,不适合在线处理)
CSV存储引擎不支持分区。
可以对数据文件直接编辑(保存文本文件内容)
7) BlackHole
MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉, 不做实际存储;Select语句的内容永远是空。 和Linux中的 /dev/null 文件完成的作用完全一致。
那么, 一个不能存储数据的引擎有什么用呢?
Blackhole虽然不存储数据,但是MySQL还是会正常的记录下Binlog,而且这些Binlog还会被正常的同步到Slave上,可以在Slave上对数据进行后续的处理。 这样对于在Master上只需要Binlog而不需要数据的场合下,balckhole就有用了。
BlackHole 还可以用在以下场景
验证dump file语法的正确性
以使用blackhole引擎来检测binlog功能所需要的额外负载
由于blackhole性能损耗极小,可以用来检测除了存储引擎这个功能点之外的其他MySQL功能点的性能。
总结
不同应用的特点是千差万别的,选择适应存储引擎才是最佳方案也不是绝对的,这需要根据实际应用进行测试,从而得到最适合的结果。
文章评论