数据库存储引擎是数据库底层软件组件。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。MySQL的核心就是存储引擎。
查看MySQL支持的引擎类型
在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体要求,可以对每一个表使用不同的存储引擎。MySQL5.6支持的存储引擎有:InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE等。
可以使用SHOW ENGINES语句查看系统所支持的引擎类型。
Support列的值表示某种引擎是否能使用。DEFAULT为默认存储引擎。
InnoDB存储引擎
MySQL5.5.5之后,默认的存储引擎。支持事务安全表(ACID),支持行锁定和外键。
主要特性有:
- InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。在SQL查询中,可以将InnoDB类型的表与其他MySQL的表的类型混合起来。
- InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
- InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲区。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件。
- InnoDB支持外键完整性约束。存储表中的数据时,每张表的存储都是按主键顺序存放,如果没有显示指定主键,InnoDB会为每一行生成一个隐藏的6个字节的ROWID,并以此作为主键。建议InnoDB的主键采用数据库自增策略。后期再补充InnoDB的索引
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。MyISAM拥有较高的插入、查询速度,但不支持事务。在MySQL5.5.5之前的版本中,MyISAM是默认存储引擎。
主要特性有:
- 大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。
- 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块。若下一个块被删除,就扩展下一块来自动完成。
- 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16个。
- 最大的键长度是1000字节,可以通过编译来改变。对键长度超过250字节的情况,一个超过1024字节的键将被用上。
- BLOB和TEXT列可以被索引。
- NULL值被允许在索引的列中,这个值占每个键的0~1个字节。
- 所有数字键值以高字节优先被存储,以允许一个更高地索引压缩。
- 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE时,该列被更新同时被刷新。
- 可以把数据文件和索引文件放在不同目录。
- 每个字符列可以有不同的字符集。
- 有VARCHAR的表可以固定或动态记录长度。
- VARCHAR和CHAR列可以多达64KB。
Memory存储引擎
Memory存储引擎将表中的数据,存储到内存中。为查询和引用其他表数据提供快速访问。
主要特性有:
- 每一个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度。
- 执行哈希(Hash)索引和BTree索引。
- 在一个Memory表中可以有非唯一键。
- 使用一个固定的记录长度格式。
- 不支持BLOB和TEXT列。
- 支持AUTO_INCREMENT列、可以对包含NULL值的列建立索引。
- 表内容被存在内存中。
- 当不在需要表的内容时,要释放被表使用的内存,应该执行DELETE FROM或TRAUNCATE TABLE,或删除整个表(DROP TABLE)。(这里不阐述DELETE、TRAUNCATE、DROP之间的区别)
存储引擎的选择
更改数据表存储引擎
查看数据表存储引擎,使用SHOW CREATE TABLE <表名\G>,语句进查看。(“\G”是参数,使结果更加直观,易于查看)
更新数据表存储引擎,使用ALTER TABLE <表名> ENGINE=<存储引擎名>;
注意
MySQL中外键约束是用来保证数据的参照完整性,如果表之间需要关联外键,却指定了不同的存储引擎,这些表之间是不能创建外键约束的。