如何以最短的停机时间运行OPTIMIZE TABLE

时间:2013-08-27 14:42:36

标签: mysql sql optimization

我在生产环境中的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       |                |
+-------------+--------------+------+-----+---------+----------------+

3 个答案:

答案 0 :(得分:6)

Percona Toolkit的pt-online-schema-change为您完成此操作。在这种情况下,它运作良好。

答案 1 :(得分:2)

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

根据innodb_buffer_pool的大小(如果表是innodb),主机上的空闲内存,我会尝试在OS的页面缓存中预加载整个表,这样至少可以加速读取数据增加了几个数量级。

如果你正在使用innodb_file_per_table,或者它是一个MyISAM表,那么很容易确保使用“time cat /path/to/mysql/data/db/huge_table.ibd> / dev来缓存整个文件/空值”。当您重新运行该命令并在几秒钟内运行时,您可以假设文件内容位于OS页面缓存中。

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

答案 2 :(得分:0)

This article建议首先删除表中的所有索引,然后对其进行优化,然后再添加索引。它声称速度差异只是优化的20倍。