MySQL存储引擎的选择
MySQL存储引擎简介
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作
。简而言之,存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
在 MySQL 中,可以对每一个表使用不同的存储引擎。MySQL 5.7 支持的存储引擎有InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE
等,下面将简单介绍InnoDB、MyISAM和Memory三种常用的存储引擎。
常用存储引擎
MySQL InnoDB存储引擎
MySQL 5.6及以后的版本,默认的存储引擎是InnoDB。
InnoDB引擎支持事务(ACID),支持崩溃修复和自增列,支持行锁定和外键。
其特点如下:
- 使用的锁粒度为行级锁,从而支持更高的并发。
- 给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全
ACID
。 - InnoDB是为处理大数据量而做的最大性能设计,其CPU计算效率优于其他基于磁盘的关系型数据库引擎。
- 支持外键完整性约束,存储表中的数据时按主键顺序存放。
- 可以通过
auto_increment
设置自动增长列。
MySQL MyISAM存储引擎
在 MySQL 5.1 版本及之前的版本,MyISAM是默认的存储引擎。
MyISAM引擎查询效率高,但是不支持事务,也不支持外键。使用此引擎创建数据库会生成3个文件,包括表定义文件frm、表数据文件myd和索引文件myi。
其特点如下:
- 使用的锁粒度为表级锁,不支持行级锁,添加和修改时会进行锁表操作,因此写入效率较低。
- 索引会单独存放.myi文件,且它的索引是直接定位到OFFSET的,查询效率较高。
- 每个MyISAM表可创建的最大索引数是64,每个索引最大可含列数是16。
- BLOB和TEXT列可以被用于索引。
- VARCHAR和CHAR列可存储的内容多达64KB。
MySQL Memory存储引擎
Memory存储引擎将表中的数据存储到内存RAM
中,为查询和引用其他表数据提供快速访问。每个Memory表会与一个磁盘文件frm相关联。
其特点如下:
- 使用的锁粒度为表级锁,在查询量比较大时会出现性能瓶颈。
- 支持的数据类型有限制,
不支持TEXT和BLOB类型
。对于字符串类型的数据,VARCHAR会被自动存储为CHAR
,造成空间浪费。 - 数据存放在内存中,默认使用HASH索引,查询速率快。
- 每个Memory表可创建的索引为32,每个索引可含16列。
- 对表的大小有限制,太大的表无法缓存在内存中。如果一个内部表很大,会被转化为磁盘表。
如何选择存储引擎
对于上述三种引擎,我们对其支持的特性总结如下表。
- | 存储限制 | 事务安全 | 锁机制 | B树索引 | 哈希索引 | 全文索引 | 数据缓存 | 索引缓存 | 空间使用 | 内存使用 | 写入速度 | 支持外键 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
InnoDB | √ | √ | 行锁 | √ | × | × | √ | √ | 高 | 高 | 低 | √ |
MyISAM | √ | × | 表锁 | √ | × | √ | – | √ | 低 | 低 | 高 | × |
Memory | √ | × | 表锁 | √ | √ | × | √ | √ | – | 中等 | 高 | × |
结合上面的表格,有关如何选择运用这三种存储引擎,我们可以得出:
- InnoDB存储引擎的优势是支持事务,能适应高并发。对于计算逻辑较多或者财务系统等对于数据准确性要求高、并发量较大,并且在并发条件下要求数据一致性的应用,InnoDB是合适的选择。
- MyISAM存储引擎不支持事务和外键,优势是访问速度比较快。如果系统读取数据的情况多,更新数据的操作少,并且对于业务完整性、并发量要求不是很高的应用,考虑选择MyISAM存储引擎。
- Memory存储引擎的数据访问速度快,但是由于数据在内存中, 一旦服务器故障数据很容易丢失。对于读写效率要求高,并且涉及数据较少或对数据丢失不敏感的应用,适合使用Memory。
总的来说,不同的存储引擎适合不同的应用场景,我们需要选择合适的存储引擎来满足性能要求和实际需求。
参考文章:MySQL数据类型和存储引擎