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