MySQL 存储引擎
各类存储引擎
- InnoDB
- 从 MySQL 5.5.8 版本开始的默认存储引擎,设计目标主要是面向在线事务处理(OLTP)应用,支持事务
- 特点:行锁设计、支持外键、支持非锁定读(默认读取操作不会产生锁)
- 通过多版本并发控制(MVCC)实现高并发性,实现了 SQL 标准的四种隔离级别(默认为 repeatable)
同时使用 next-key locking 的策略避免幻读的产生。 除此之外还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能 - 对于表中存储的数据,InnoDB 采用聚集的方式,每张表的存储都是按照主键的顺序进行存放的,如果没有显式定义主键,InnoDB 为每一行生成一个 6 字节的 ROWID 作为主键
- MyISAM
- 不支持事务,表锁设计,支持全文索引
- MyISAM 存储引擎由 MYD 和 MYI 组成,MYD 用于存放数据,MYI 用于存放索引
- 只缓存索引文件,数据文件的缓存交由操作系统本身完成
- NDB
- 是一个集群存储引擎,类似于 Oracle 的 RAC 集群,但集群结构是 share nothing,因此可以提供更高的可用性
- NDB 的特点是数据全部存放在内存中,因此主键查找速度极快,并且可以通过添加 NDB 数据存储节点线性提高数据库性能
- NDB 的连接操作 Join 是在 MySQL 数据库层完成的,而非在存储引擎层完成,因此复杂连接操作需要巨大的网络开销,查询速度很慢
- Memory
- Memory 将表中的数据存放在内存中,如果数据库发生重启或者崩溃,表中的数据都会丢失,适用于存储临时数据的临时表以及数据仓库维度的维度表,默认使用哈希索引
- 虽然 Memory 速度快,但是使用时具有一定限制,比如只支持表锁、并发性能较差、不支持 TEXT 和 BLOB 等类型。最重要的是 Memory 存储变长字段时,按照定长字段的方式进行存储,会导致内存浪费
- Archive
- 只支持 INSERT 和 SELECT 操作,从 MySQL 5.1 开始支持索引
- 使用 zlib 算法将数据行进行压缩后存储,压缩比可以达到 1:10,非常适合用于存储归档数据,比如日志文件等
- Federated
- 不存储数据,只是指向远程 MySQL 数据库上的表,类似于 SQL Server 的链接服务器和 Oracle 的透明网关
- Maria
- 新开发的存储引擎,目标是替换原有的 MyISAM
- 支持缓存数据和索引文件,使用行锁设计,提供 MVCC 功能,支持事务和非事务安全选项
各存储引擎之间的比较
常见存储引擎的对比
MyISAM | InnoDB | |
---|---|---|
存储结构 | 每张表被存放在三个文件:frm - 格定义 MYD (MYData)- 数据文件 MYI (MYIndex)- 索引文件 | 所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB |
存储空间 | MyISAM 可被压缩,存储空间较小 | InnoDB 的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引 |
可移植性、备份及恢复 | 由于 MyISAM 的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作 | 免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了 |
事务安全 | 不支持 每次查询具有原子性 | 支持 具有事务 (commit)、回滚 (rollback) 和崩溃修复能力 (crash recovery capabilities) 的事务安全 (transaction-safe (ACID compliant)) 型表 |
AUTO_INCREMENT | MyISAM 表可以和其他字段一起建立联合索引 | InnoDB 中必须包含只有该字段的索引 |
SELECT | MyISAM 更优 | |
INSERT | InnoDB 更优 | |
UPDATE | InnoDB 更优 | |
DELETE | InnoDB 更优 它不会重新建立表,而是一行一行的删除 |