2

我在生产环境中的 64GB RAM 机器上有一个 +-40GB 的 MySQL 5.5 DB。所有表都是 InnoDB。还有一个从站作为备份运行。

一张表——最重要的一张——增长到 150M 行,插入和删除变得很慢。为了加快插入和删除,我删除了一半的表。这并没有像预期的那样加速;插入和删除仍然很慢。

我读过跑步OPTIMIZE TABLE可以在这种情况下提供帮助。据我了解,此操作需要对整个表进行读取锁定,并且在大表上优化表可能需要相当长的时间。

什么是优化此表同时最小化停机时间的好策略?

编辑要优化的特定表有 +- 91M 行,如下所示:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| channel_key | varchar(255) | YES  | MUL | NULL    |                |
| track_id    | int(11)      | YES  | MUL | NULL    |                |
| created_at  | datetime     | YES  |     | NULL    |                |
| updated_at  | datetime     | YES  |     | NULL    |                |
| posted_at   | datetime     | YES  |     | NULL    |                |
| position    | varchar(255) | YES  | MUL | NULL    |                |
| dead        | int(11)      | YES  |     | 0       |                |
+-------------+--------------+------+-----+---------+----------------+
4

3 回答 3

6

Percona Toolkit 的pt-online-schema-change为您完成了这项工作。在这种情况下,它工作得很好。

于 2013-09-11T12:58:55.753 回答
2

插入 300 毫秒似乎过长,即使磁盘速度较慢。我会调查根本原因。优化此表将花费大量时间。MySQL 将在磁盘上创建表的副本。

根据您的 innodb_buffer_pool 的大小(如果表是 innodb),主机上的可用内存,我会尝试将整个表预加载到操作系统的页面缓存中,这样至少读取数据会加快几个数量级。

如果您使用的是 innodb_file_per_table,或者它是一个 MyISAM 表,则很容易确保使用“time cat /path/to/mysql/data/db/huge_table.ibd > /dev/null”缓存整个文件。当您重新运行该命令时,它会在几秒钟内运行,您可以假设文件内容位于操作系统页面缓存中。

通过查看临时文件的大小,您可以在“优化表”运行时监控进度。它通常位于数据库数据目录中,临时文件名以破折号 (#) 字符开头。

于 2013-08-27T18:01:22.387 回答
0

本文建议先删除表中的所有索引,然后对其进行优化,然后再添加索引。它声称与仅优化相比,速度差异是 20 倍。

于 2017-12-14T08:06:30.717 回答