MyISAM vs InnoDB MariaDB 用于大量读取操作

MyISAM vs InnoDB MariaDB for lots of read operations

多年来我一直在读到,当您有大量读取操作与大量 insert/update/deletes 相比,MyISAM 是 MySQL/MariaDB 的首选数据库引擎。我坚持使用 MyISAM for tables,它们在 SELECT 方面很重。

我最近有大约 20 个 table 中有 5 个被损坏,我无法使用各种修复方法恢复生机。事实证明,corrupted/died 中的每个 table 都是 MyISAM。不记得每个 MyISAM table 是否已损坏。但是,据我所知,none 的 InnoDB table 已损坏。

由于过去几天我一直在 eating/breathing 和睡眠 MariaDB 工作,通过恢复和改进我们的数据库基础设施(副本,备份等),我注意到 InnoDB 现在是默认和首选引擎MariaDB(并非总是如此)。

我还读到 InnoDB tables 像我最近那样死得很惨的可能性要小得多。当 InnoDB table 死亡时,它们更容易恢复。

综上所述,我正在认真考虑将所有剩余的 MyISAM table 转换为 InnoDB。

我的问题是:

  1. 我是否应该期望在依赖这些 table 的实时系统(网站、移动应用程序后端等)上发生任何事情,或者更有可能在转换后一切都会继续运转?
  2. 当谈到性能时,在 SELECT 方面很重的系统上它可能会变得更好还是更差?为了 tables 的未来稳定性而进行转换可能仍然是值得的,即使性能受到很小的影响,我只是想知道我在做什么,所以我可以增加 RAM 和 CPU 需要的资源。
  3. 转换这些 table 会以任何方式中断或更改复制吗?
  4. 最后一个问题...这些天我真的有什么好的理由将我的 table 保留在 MyISAM 中吗?好像没有。

提前感谢您对这些项目的任何帮助。

是的,它始终是稳定性和性能之间的 trade-off。但是,如果您使用的是 MariaDB,为什么不使用 Aria,它应该可以让您两全其美?

Should I expect anything to blow on a live system which relies on these tables

是的 - 您应该始终计划从腐败、勒索软件、流星袭击中恢复。 InnoDB 可能比 MyISAM 更灵活,但它并不能解决所有问题。

is it likely to get better or worse on a system that is heavy on the SELECT side of things?

呃……不会再快了。性能是否会明显下降是一个非常复杂的问题,取决于很多很多因素。如果您正在进行 export/import 迁移,那么返回应该很容易。

Will converting these tables break or changes replication in any way?

仅当您尝试在 运行 复制的同时进行转换时。

请在迁移前设置 innodb_file_per_table。

如果重复损坏不足以促使您放弃 MyISAM,并且更新的基准测试通常显示 InnoDB 即使对于只读 tables 也更快,并且对 MyISAM 的标记支持并不重要(特别是 MyISAM 和任何“集群”),那我能说什么呢?

OTOH,如果你有“巨大的”tables,请注意 InnoDB 占用的磁盘 space 是 MyISAM 占用的 2x-3x。 (Q4) 可能 是在 MyISAM 中保留 table 的唯一站得住脚的论据,至少在升级磁盘之前是这样。

如果您是运行“旧”版本,则可能缺少某些功能。例如,FULLTEXTSPATIAL 最近才添加到 InnoDB。

有关转换陷阱的更多详细信息:http://mysql.rjweb.org/doc.php/myisam2innodb And be sure to change key_buffer_size (down) and innodb_buffer_pool_size (up): http://mysql.rjweb.org/doc.php/memory

(Q3) 复制通常会起作用;在主服务器和副本服务器上为 table 使用不同的引擎甚至是可以的。尽管如此,还是会有一些小问题。检查 binlog_format.

(Q2) CPU 资源很少成为 MySQL/MariaDB 应用程序的瓶颈。如果是,通常有一个解决方法,即构建更好的索引 and/or 重新制定查询。

说到这里,请注意 InnoDB 将 PK 与数据聚类;这对索引的选择有一定的影响。尤其是 Many-to-many . To improve your indexes, see Index Cookbook

我同意 innodb_file_per_table = ON 开始更改之前的设置。