我有一个带有400万行MyISAM表的MySQL数据库。我每周更新一次这个表约2000个新行。更新后,我然后改变这样的表:
ALTER TABLE x ORDER BY PK DESC
我按主键字段按降序排列表格。这对我的开发机器(带3GB内存的Windows)没有任何问题。有三次我在生产Linux服务器上成功尝试过它(512MB内存 - 并且每次大约6分钟就能实现结果排序表),我最后一次尝试它时我不得不在大约30分钟后停止查询并重建来自备份的数据库。
512MB服务器可以在这么大的表上处理那个alter语句吗?我已经读过创建临时表来执行ALTER TABLE命令。
问题:这个alter命令可以安全运行吗?改变表格的预计时间应该是多少?
答案 0 :(得分:3)
正如我刚才所读,ALTER TABLE ... ORDER BY ...
查询对于提高某些情况下的性能非常有用。令我惊讶的是PK指数对此没有帮助。但是,从the MySQL docs开始,似乎InnoDB 确实使用了索引。然而InnoDB往往比MyISAM慢。也就是说,使用InnoDB,你不需要重新订购表,但你会失去MyISAM的超快速度。它仍然值得一试。
你解释问题的方式,似乎有太多的数据加载到内存中(可能甚至交换进行?)。您可以通过监视内存使用情况轻松检查。很难说,因为我不太了解MySQL。
另一方面,我认为你的问题出在一个非常不同的地方:你使用的机器只有512兆的RAM作为数据库服务器,一个表包含超过4Mio的行...而且你正在表现得很好在该机器上的整个表上执行内存繁重的操作。似乎512Megs几乎不足以满足要求。
我在这里看到的一个更基本的问题:您正在与生产环境非常不同的环境中进行开发(并且很可能也在进行测试)。您要解释的问题是可以预期的。您的开发机器的内存是生产机器的六倍。我相信我可以肯定地说,处理器也快得多。在这种情况下,我建议您创建一个模仿生产站点的虚拟机。这样,您可以轻松测试项目,而不会中断生产站点。
答案 1 :(得分:1)
是主键auto_increment?如果是这样,那么做ALTER TABLE ... ORDER BY不会改进任何东西,因为无论如何都会按顺序插入所有内容。
(除非你有很多删除)
答案 2 :(得分:0)
我可能会创建一个以PK值排序的View,这样一来,在执行ALTER时你不需要锁定那个巨大的表。
答案 3 :(得分:0)
你要求它做的是重建整个表及其所有索引;这是一项昂贵的操作,特别是如果数据不适合ram。它会完成,但如果数据不适合ram,它将会大大减慢,特别是如果你有很多索引。
在选择在生产中运行具有如此微小内存的机器时,我质疑你的判断。无论如何:
你可以做一些调整来尝试提供帮助;它在很大程度上取决于您的架构(特别是索引)。 4M行不是很多(对于具有正常ram数量的机器)。
答案 4 :(得分:0)
如果您正在使用InnoDB,则不必在插入后或查询时明确执行ORDER BY
。根据MySQL 5.0手册,InnoDB已默认为查询结果的主键排序:
http://dev.mysql.com/doc/refman/5.0/en/alter-table.html#id4052480
默认情况下,MyISAM表以插入顺序返回记录,如果您只是附加到表中,而不是使用UPDATE
查询来就地修改任何行,这可能也会起作用。