目录

MySQL 存储引擎

MySQL 也有很多存储引擎,不过常用的还是 InnoDB 引擎,本文就汇总一下这些存储引擎。

MySQL 的存储引擎

  • Archive:用于数据存档的引擎(数据行被插入后就不能再修改了)。非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差
  • BDB:源自 Berkeley DB,事务型数据库的另一种选择,支持 COMMITROLLBACK 等其他事务特性
  • BlackHole:黑洞引擎(写操作是删除数据,读操作是返回空白记录)。由于写入的任何数据都会消失。一般用于记录 binlog 做复制的中继
  • CSV:逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .CSV 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引
  • Example:实例(存根)存储引擎。官方实例
  • Falcon:用来进行事务处理的存储引擎
  • Federated:用来访问远程数据表的存储引擎。将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
  • InnoDB:具备外键支持功能的事务处理引擎。MySQL-5.5 版本后 MySQL 的默认数据库引擎,是专为事务设计的存储引擎,支持 ACID 事务,支持外键和行级锁定,拥有高并发处理能力。但是,InnoDB 在创建索引和加载数据时,比 MyISAM
  • Memory:内存引擎。所有数据置于内存,表结构不是存储在内存中的存储引擎,查询时不需要执行磁盘 I/O 操作,所以要比 MyISAMInnoDB 快很多倍。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失,表结构不会丢失
  • Merge/MRG_MYISAM:管理由多个 MyISAM 数据表构成的数据表集合。将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用
  • MyISAM:不支持事务和行级锁,所以 MyISAM 引擎速度很快,性能优秀。MyISAM 可以对整张表加锁,支持并发插入,支持全文索引
  • NDB/ClusterMySQL Cluster 专用存储引擎。高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
  • PERFORMANCE_SCHEMA:Performance Schema

查看数据库支持的引擎

1
SHOW ENGINES;

MyISAM 和 InnoDB

名称MyISAMInnoDB备注
使用场景为速度而设计,和 SELECT 搭配使用更好为高可靠性和高性能而设计,适合处理大量数据
表锁类型表级锁,特定的操作会将整张表锁起来,上锁期间,表中的数据不能进行其它操作。偏向静态数据,动态数据会影响性能行级锁,只对 SELECT,UPDATE,DELETE 操作的特定数据加上行锁,上锁期间,表中的其它数据依然能被操作
外键支持不支持支持,对外键和引用完整性支持,包括递归式删除和更新
事务支持不支持,没有 COMMITROLLBACK,对操作没有回退的余地支持,执行 COMMITROLLBACK 操作,可以将事务中的数据变化进行回滚,崩溃后的自动恢复
集群支持不支持并不完全支持。可以将表转换为 NDB 存储引擎而用在集群环境中
数据操作数据压缩,自我复制,查询缓存,数据加密数据压缩,自我复制,查询缓存,数据加密
全文索引支持全文检索,需要通过 FULLTEXT 索引来实现不支持 FULLTEXT 类型的全文索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好
存储结构每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为 .MYD - MYData。索引文件的扩展名是 .MYI - MYIndex所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
存储空间可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉),动态表,压缩表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
AUTO_INCREMENT可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增InnoDB 中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列
表主键允许没有任何索引和主键的表存在,索引都是保存行的地址如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值
表的行数保存有表的总行数,如果 SELECT COUNT(*) FROM table; 会直接取出出该值没有保存表的总行数,如果 SELECT COUNT(*) FROM table; 就会遍历整个表,消耗相当大,但是在加了 wehre 条件后,MyISAMInnoDB 处理的方式都一样
其它支持支持空间数据类型和 SPATIAL 索引InnoDB 存储引擎会把数据表集中存储在一个共享的表空间里