MySQL知识体系 —— 存储引擎
一、MySQL 数据库引擎简介
1. ISAM(Indexed Sequential Access Method)
ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM 的两个主要不足之处在于,它不支持事务处理,也不能够容错。如果你的硬盘崩了,那么数据文件就无法恢复了。如果你正在把 ISAM 用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL 能够支持这样的备份应用程序。
注意:使用 ISAM 注意点:必须经常备份所有实时数据。版本MySQL 5.7 以后不再支持 ISAM。
2. MyISAM 存储引擎
MyISAM 是 MySQL 的 ISAM 扩展格式(MySQL5.5 之前版本的缺省数据库引擎)数据库引擎。除了提供 ISAM 里所没有的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是需要经常运行 OPTIMIZE TABLE 命令,来修复被更新机制所浪费的空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的 MyISAMPACK 工具。MyISAM 强调了快速读取操作,这可能就是为什么 MySQL 受到web开发如此青睐。所以,大多数虚拟主机提供商和 INTERNET 平台提供商只允许使用 MyISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。
MyISAM 引擎使用注意:必须经常使用 OPTIMIZE TABLE 命令清理空间;必须经常备份所有实时数据。工具有用来修复数据库文件的 MyISAMCHK 和用来恢复浪费空间的 MyISAMPACK 工具。不支持事务;数据越多,写操作效率越低,因为要维护数据和索引信息(索引列越多,效率越低)。
使用 MyISAM 引擎,会生成 3 个文件:
- .frm:表结构信息
- .MYD:数据文件
- .MYI:表的索引信息
MyISAM 的特点:
- 使用表级别锁
- 查询速度快
- 不支持事务和外键
3. InnoDB 存储引擎
InnoDB 数据库引擎是造就 MySQL 灵活性的技术的直接产品,这项技术是MySQL++API。在使用 MySQL 的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库引擎不支持事务处理也不支持外键。尽管要比 ISAM 和 MyISAM 引擎慢很多,但是 InnoDB 包括了事务处理和外键支持。InnoDB 是现在 MySQL常用版本(5.5以上版本)默认引擎,也是默认的存储引擎。
MySQL 官方对 InnoDB 是这样解释的:InnoDB 给 MySQL 提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句提供一个 Oracle 风格一致的非锁定读,这些特色增加了多用户部署的性能。没有在 InnoDB 中扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。InnoDB 也支持 FOREIGN KEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其他 MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB 是为处理巨大数据量时保证最高性能而设计的,它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。
在MySQL 5.7版本中,InnoDB 存储引擎管理的数据文件为两个:
- .frm:表结构信息
- .idb:数据信息和表索引信息
InnoDB 的特点:
3. 支持事务,所以效率相对于 MyISAM 会慢一些
4. 数据多版本读取(InnoDB + MyISAM + ISAM)
5. 锁定机制的改进,支持行级锁,而 MyISAM 是表级锁
6. 支持外键
二、InnoDB 与 MyISAM 的区别
4. InnoDB 与 MyISAM 的区别
1、InnoDB 支持事务,MyISAM 不支持。对于 InnoDB 而言,每一条 SQL 语句都默认封装成事务,自动提交,这样会影响速度,所以最好把多条 SQL 语句放在 start transaction 和 commit 之间,组成一个事务;
2、InnoDB 支持外键,MyISAM 不支持。将一个包含外键的 InnoDB 表转为 MyISAM 会失败;
3、InnoDB 是聚集索引,数据文件是和索引绑定在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后在通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集性索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4、InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5、InnoDB 不支持全文索引,MyISAM 支持全文索引,查询效率上 MyISAM 要高一些:5.7 已经支持。
5. 两种存储引擎该如何选择
1、是否需要支持事务。需要支持就选择使用 InnoDB,不需要则选 MyISAM。
2、是否对该表的操作绝大多数为读操作。是的话选MyISAM,如果写操作也较为频繁,则使用 InnoDB。
3、是否接受系统崩溃后 MyISAM 恢复起来较为困难。
从MySQL 5.5 版本开始,InnoDB 已经成为 MySQL 的默认引擎(以前是MyISAM),说明其优势是有目共睹的,如果你不知道该用哪个,那就用InnoDB,至少不会差。
三、管理存储引擎
查看所有存储引擎信息:
show engines
查看数据库当前使用的存储引擎
show variables like '%storage_engine%'
查看数据库表所用的存储引擎
show create table table_name
创建表指定存储引擎
create table table_name (...) engine = engine_name
修改表的存储引擎
alter table table_name engine = engine_name