MySQL支持好几种存储引擎(storage engine,它们以前被称为”数据表处理器”),由同一个存储引擎所实现的数据表具有一些共同的特征或属性
MySQL的存储引擎包括:
Ø ARCHIVE 用于数据存档的引擎(数据行被插入后就不能再修改)
Ø BLACKHOLE 这种存储引擎的写操作是删除数据,读操作是返回空白记录
Ø CSV 这种存储引擎在存储数据时以逗号作为数据的分隔符
Ø EXAMPLE 示例(存根)存储引擎
Ø Falcon 用来进行事务处理的存储引擎
Ø FEDERATED 用来访问远程数据表的存储引擎
Ø InnoDB 具备外键支持功能的事务处理引擎★
Ø MEMORY 内存里的数据表(最早称为HEAP)★
Ø MERGE 用来管理有多个MyISAM数据表构成的数据表集合★
Ø MyISAM 默认的存储引擎★
Ø NDB MySQLCluster专用的存储引擎【即 MySQL集群】
使用SHOW ENGINES 可以查看目前安装的数据库支持什么存储引擎
MyISAM – 不支持事务,但读取速度快
Ø MyISAM是MySQL的缺省的数据库引擎;
Ø MyISAM存储引擎支持全文索引,但这需要通过FULLTEXT索引来实现;
Ø MyISAM支持空间数据类型和SPATIAL索引
Ø MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。
Ø MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。
Ø MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。
MEMORY – 最早称为HEAP
Ø MEMORY允许只驻留在内存里的临时表格,这些数据有着长度固定不变的数据行,这两个特点使得数据表的检索速度非常快。这也意味着不能使用BLOB和TEXT这样的长度可变的数据类型。其中varchar是一种长度可变的数据类型,但因为它在MySQL内部被当做一种长度固定不变的char类型,所以可以在MEMORY数据表中使用;
Ø 驻留在内存里让MEMORY要比MYISAM快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失;
Ø 在数据行被删除的时候,MEMORY也不会浪费大量的空间;
Ø MEMORY表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格;
Ø 默认情况下MEMORY使用散列索引,利用这种索引进行”相等比较”的速度非常快,但进行”范围比较”的速度就慢多了,散列索引也不适于用在ORDERBY子句中。
InnoDB – 支持外键和事务
Ø 支持提交和回滚操作,确保数据在事务处理过程中万无一失。还可以通过创建保存点(savepoint)来实现部分回滚(partial rollback);
Ø 在系统崩溃后可以自动恢复;
Ø 外键和引用完整性支持,包括递归式删除和更新;
Ø 数据行基本别的锁定和多版本的共存,是的InnoDB表在需要同时进行检索和更新操作的复杂查询里表现出非常好的并发性能;
Ø 尽管要InnoDB比MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外键的支持,这两点都是MyISAM所没有的。
MERGE – 提供一种把多个MyISAM数据表合并为一个逻辑单元的手段
Ø 查询一个MERGE数据表相当于查询其所有的成员数据表,这样的好处之一是绕开文件系统对各个MyISAM数据表的最大长度限制;
Ø 用来构造MERGE数据表的所有数据表必须具有同样的结构,即,各成员数据表里的数据列应定义同样的名字、同样的类型、同样的顺序,索引也必须用同样的办法和同样的顺序定义。
MyISAM和InnoDB的简单比较
MyISAM适合:
(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:
(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。