【问题标题】:Converting Large MyISAM table to InnoDB将大型 MyISAM 表转换为 InnoDB
【发布时间】:2016-06-14 22:37:09
【问题描述】:

我有一个 MyISAM 表(10M 行,3.5G,计划达到 ~80M),但我总是无法将其转换为 InnoDB。

我试过了:

  • ALTER TABLE - 2 分钟后断开连接。也许我做错了。

  • mysqldump - 尝试创建转储,然后将 ENGINE=MyISAM 更改为 ENGINE=InnoDB

它开始很好,但随着新表中的行数增加(~3M),它变得越来越慢,最后在几个小时后超时(--reconnect 为 ON)。

如果我将缓冲池大小增加到 2G,它会在更多行 (~6M) 后变慢,但机器内存不足。

在转储还原期间的SHOW PROCESSLIST 中,我看到许多查询在“查询结束”状态下停留了 2-3 分钟。 google-ing 无法理解这是什么意思。

  • INSERT INTO ... SELECT * FROM - 创建了相同结构的表并尝试了这个。在几百万行之后也会减慢然后超时。 (感谢@Ernestas Stankevičius 提醒我这一点。)

服务器:

AWS EC2 4GB Ubuntu14.04

my.cnf:

wait_timeout=28800
connect_timeout=28800
innodb_lock_wait_timeout=28800
net_read_timeout=7200
net_write_timeout=7200
innodb_buffer_pool_size=1G
innodb_io_capacity=100 /*200 is heavy on the machine*/
innodb_flush_log_at_trx_commit=0
reconnect=1

【问题讨论】:

  • 我建议您创建具有相同结构但 innodb 的新表,然后从 myisam 插入其中,然后删除旧表并重命名新表。您也可能遇到大量插入问题,因此请尝试同时插入 1000 条记录。也不要忘记索引,因为以后添加它们也很麻烦。
  • @ErnestasStankevičius 哦,谢谢你提醒我!这是我尝试的第一件事,几百万行后它也变慢了。
  • 检查common_schema - query_script_split,可能有用。
  • @MorCohen “在几百万行之后变慢了” - 这听起来像你有很多索引。如果你有这样的,它们会减慢批量插入。尝试创建没有索引的新 InnoDB 表,并在数据加载后创建它们。

标签: mysql innodb myisam large-data


【解决方案1】:

innodb_buffer_pool_size=2G 对于 4GB 机器来说可能是危险的高。试试1500M。交换或耗尽内存比拥有一个小缓存更糟糕。

从 mysql 命令行工具运行ALTER,而不是一些 UI。 (用户界面可能有您要达到的时间限制。

您正在运行什么版本的 MySQL?你有多少索引?请告诉我们SHOW CREATE TABLE。删除所有辅助键,仅保留 PRIMARY KEY。添加转换后的其他索引; 5.6 或更高版本可以“就地”做到这一点。

如果您没有PRIMARY KEY,请创建一个; InnoDB 真的需要一个。

这可能涵盖了大多数情况:

CREATE TABLE new LIKE real;
ALTER TABLE new ENGINE=InnoDB,
    DROP ..., -- all the secondary keys
    ADD PRIMARY (...), -- if needed
    ENGINE=InnoDB;
INSERT INTO new (...)
    SELECT ... FROM real ORDER BY ... -- insert in PK order
ALTER TABLE new
    ADD index ...;  -- rebuild secondary key(s) (see note)
RENAME TABLE real TO old, new TO real;
DROP TABLE old;

注意:如果您运行的是 5.5 或更早版本,请将所有辅助键添加到单个 ALTER 中。如果您运行的是 5.6 或更高版本,请一次添加一个。

【讨论】:

    【解决方案2】:

    我的解决方案是从新的 (InnoDB) 表结构中删除一些索引,然后添加数据。
    我用INSERT new_table SELECT * FROM old_table复制数据

    您删除的索引越多 - 数据进入的速度越快。

    之后,我重新创建了索引。
    感谢@i486。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2010-12-25
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多