【问题标题】:Changing Default Storage Engine Amazon RDS MariaDB更改默认存储引擎 Amazon RDS MariaDB
【发布时间】:2018-03-05 01:11:52
【问题描述】:

我有数百个大型表已从我的 MySQL 数据库迁移到 RDS MariaDB(使用亚马逊迁移服务)。所有的存储引擎都从 MyISAM 转移到了 InnoDB。这会对性能造成灾难性影响。

简而言之,我希望将默认存储引擎更改为 MyISAM,然后重新迁移所有表。我也愿意接受有关如何执行此操作的任何其他想法(例如在迁移工具中使用某种设置)。我真的不想创建一个脚本来改变它们,因为这意味着我每次导入数据时都需要这样做。

我尝试更改 ParameterGroup default_storage_engine,但是当我进入我正在运行的实例的 ParameterGroup 时,默认存储引擎显示为只读。

我也尝试过创建一个新的参数组,结果也是如此。该值显示为“modifiable: false”。

非常感谢任何帮助。我查看了其他答案,但我认为修改 my.cnf 与 RDS 无关。如果是,请告诉我。

【问题讨论】:

    标签: mysql amazon-web-services mariadb myisam rds


    【解决方案1】:

    显然 RDS 不允许您更改该参数。

    您可以一次将每个表更改为 MyISAM:

    ALTER TABLE MyTable ENGINE=MyISAM;
    

    您可以获得需要更改的表格列表:

    SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE='InnoDB';
    

    对于未来的表格,不要依赖默认引擎。使用在 CREATE TABLE 语句中显式命名的引擎创建表。

    不过,我要提醒您:MyISAM 正在被 MySQL 淘汰。它不支持并发写入、行级锁定、事务或原子更改。 InnoDB 一次又一次地被证明在性能上优于 MyISAM,除了极少数情况:

    • SELECT COUNT(*) FROM MyTable; 因为 MyISAM 将此统计信息保存在每个表中。这无疑是 InnoDB 或任何 MVCC 架构的一大弱点。
    • 表格扫描。但是无论如何您都不应该进行表扫描,而应该进行索引查找。针对 InnoDB 的优化查询通常比针对 MyISAM 的表扫描在性能上要好得多。

    我会鼓励你弄清楚你的查询优化并坚持使用 InnoDB。

    【讨论】:

    • MyISAM 也受到 RDS 文档的强烈反对,因为它似乎与 RDS 快照备份和时间点恢复的机制根本不兼容——这些似乎至少基于当 MySQL 从磁盘快照创建的备份恢复后首次唤醒时,InnoDB 能够从类似崩溃的状态中恢复。 MyISAM 表不能很好地处理这个问题。 (轶事观察表明,RDS 中的时间点和快照恢复似乎在启动时经历了崩溃恢复。)
    【解决方案2】:

    突然切换到 InnoDB 时的常见性能问题与“事务”有关。

    可能发生的情况是每个查询都变成了自己的事务,因为autocommit = ON。 (不要转OFF,这会导致更严重的问题。)您需要了解事务,至少足以将语句组合在一起,例如

    BEGIN;
    multiple statements, usually more than one, but not a huge number
    COMMIT;
    

    这(在许多情况下)将恢复一堆失去的性能。

    更多关于转换的讨论是here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2011-06-27
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多