在文件系统中,MySQL 将每个数据库保存为数据目录下的一个子目录。
创建表时,MySQL 会在数据库子目录下创建一个和表同名的 .frm 文件保存表的定义。
不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在 MySQL 服务层统一处理的。
1 InnoDB
- MySQL 的默认事务型存储引擎,被设计用来处理大量的短期事务。
- 实现了四个标准的隔离级别,默认级别是可重复读。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。
- 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。
- 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。
- 支持真正的在线热备份。
2 MyISAM
- MySQL 5.1 及之前的默认存储引擎
- 不支持事务和行级锁
- 崩溃后无法安全恢复。
- 支持压缩表和空间数据索引。
3 选择合适的引擎
3.1 选择 InnoDB
大部分情况下,InnoDB 都是正确的选择。
除非需要用到某些 InnoDB 不具备的特性,并且没有其他办法可以替代,否则都应该优先选择 InnoDB 引擎。
如果要用到全文索引,建议优先考虑 InnoDB 加上 Sphinx 的组合,而不是使用支持全文素引的 MyISAM。
3.2 选择 MyISAM
如果不在乎可扩展能力和并发能力,也不在乎崩溃后的数据丢失问题,却对 InnoDB 的空间占用过多比较敏感,这种场合下选择 MyISAM 就比较合适。