前言

  • 大部分情况下, InnoDB 是最正确的选择。
  • MySQL 5.5 版本将 InnoDB 作为默认的存储引擎。

除非需要用到某些 InnoDB 不具备的特性,并且没有其他办法可代替,否则应该优先选择 InnoDB 引擎。 如:如果用到全文索引,建议是 InnoDB + Sphinx 的组合,而不是使用 MyISAM。

使用不同的存储引擎,考量因素:

  • 事务:
    • InnoDB 是目前最稳定且经过验证的选择。
    • 若不需要事务,并且主要是 SELECT 和 INSERT ,可使用 MyISAM。如:日志型应用。
  • 备份:
    • 若需要在线备份,建议选择 InnoDB。
  • 崩溃恢复:
    • MyISAM 崩溃后发送损坏的概率比 InnoDB 高的多,而且恢复速度也慢。
    • 一般推荐选择 InnoDB 引擎。
  • 特有的特性:
    • 基于应用所需特性选择,如:MyISAM 支持地理空间搜索。

应用场景

日志型应用

  • 场景:
    • 记录一台电话交换机的每一通电话日志到 MySQL。
    • 通过 Apache 的 mod_log_sql 模块将网站访问信息记录到表中。
  • 推荐:MyISAM 或 Archive 存储适合该类,特点:开销低,插入数据非常快。
    • 不足:若实现日志分析报表,查询的 SQL 可能导致插入效率明显降低。
    • 解决方案:
      • 方法1:利于 MySQL 内置复制方案,复制到备库,在备库执行消耗时间和 CPU 的查询。主库仅用于高效的插入工作
      • 方法2:利用分表的方式,如:按日、月形式记录,负载均衡或负载拆分

只读或大部分情况下只读的表

  • 适合场景:读多写少,如:一些固定性配置(省市区数据等)
  • 推荐:若不介意 MyISAM 崩溃情况,可考虑使用 MyISAM 引擎。
  • 风险:崩溃引起的数据丢失
    • 原理:MyISAM 将数据写到内存中,待系统定期将数据刷到硬盘中。

推荐的方式:性能测试模拟真实环境,运行应用,拔下电源模拟崩溃测试。对崩溃恢复的第一手测试经验是无价之宝,可避免真实碰到崩溃情况手足无措。

重要:不要轻易相信 “MyISAM 比 InnoDB 快”的经验之谈。

在实际应用中,InnoDB 的速度有时候可让 MyISAM 望尘莫及,尤其使用到聚簇索引,或者将需要访问的数据放入到内存的应用。 若设计如上应用,MyISAM 在起初没问题,但应用压力上升,可能迅速恶化。各种锁争用,崩溃后的数据丢失问题也随之而来。

订单处理

  • 重要数据,需要考虑事务,推荐使用 InnoDB 引擎。

电子公告板和主题讨论论坛

  • 主要注意使用过 select count(*) from table 的情况
  • 数据量大小、引擎不一性能不一

CD-ROM 应用

  • 若需要发布一个基于 CD-ROM 或 DVD-ROM 存储 MySQL 数据文件,可考虑 MyISAM 表或 MyISAM 压缩表。
  • 特点:表数据之间互相隔离,可使用不同介质上相互拷贝。MyISAM 压缩表比未压缩表要节约很多空间,但压缩表是只读的。

大数据量

  • 大数据量的参考:创建或管理很多 InnoDB 数据库数量月 3~5TB 的内容,或者更大;单机的量,而非一个分片的量。
  • 若使用 MyISAM,数据崩溃后恢复是一个噩梦。
  • 若数据量增长到 10TB 以上级别,需要考虑建立数据仓库。Infobright 是 MySQL 数仓最成功的解决方案。
    • 有些不适合使用 Infobright,却可能适合 TokuDB。