跳到主要内容

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 功能,支持事务和非事务安全选项

各存储引擎之间的比较

各存储引擎之间的比较

常见存储引擎的对比

MyISAMInnoDB
存储结构每张表被存放在三个文件:frm - 格定义 MYD (MYData)- 数据文件 MYI (MYIndex)- 索引文件所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
存储空间MyISAM 可被压缩,存储空间较小InnoDB 的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
可移植性、备份及恢复由于 MyISAM 的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了
事务安全不支持 每次查询具有原子性支持 具有事务 (commit)、回滚 (rollback) 和崩溃修复能力 (crash recovery capabilities) 的事务安全 (transaction-safe (ACID compliant)) 型表
AUTO_INCREMENTMyISAM 表可以和其他字段一起建立联合索引InnoDB 中必须包含只有该字段的索引
SELECTMyISAM 更优
INSERTInnoDB 更优
UPDATEInnoDB 更优
DELETEInnoDB 更优 它不会重新建立表,而是一行一行的删除