我有一个 MySQL 数据库,其中有一个包含 400 万行的 MyISAM 表。我大约每周更新一次此表,添加大约 2000 个新行。更新后,我将表更改如下:
ALTER TABLE x ORDER BY PK DESC
我按主键字段按降序对表进行排序。这在我的开发机器(具有 3GB 内存的 Windows)上没有给我带来任何问题。我在生产 Linux 服务器上成功尝试了 3 次(具有 512MB RAM - 每次大约 6 分钟内获得结果排序表),最后一次尝试时,我不得不在大约 30 分钟后停止查询并重建来自备份的数据库。
512MB 的服务器可以处理这么大的表上的 alter 语句吗?我读到创建临时表来执行 ALTER TABLE 命令。
问题:这个alter命令可以安全运行吗?预计更改表格的时间应该是多少?
正如我刚刚读到的,ALTER TABLE ... ORDER BY ...
查询在某些情况下对于提高性能很有用。令我惊讶的是 PK 指数对此没有帮助。但是,从MySQL 文档 http://dev.mysql.com/doc/refman/5.1/en/alter-table.html,看来InnoDBdoes使用索引。然而,InnoDB 往往比 MyISAM 慢。也就是说,使用 InnoDB,您不需要重新排序表,但您会失去 MyISAM 的惊人速度。它仍然值得一试。
从您解释问题的方式来看,似乎加载到内存中的数据太多(也许甚至正在进行交换?)。您可以通过监视内存使用情况轻松检查这一点。很难说,因为我不太了解 MySQL。
另一方面,我认为你的问题出在一个非常不同的地方:你正在使用一台只有 512 Megs RAM 的机器作为数据库服务器,其中一个表包含超过 4Mio 行......并且你正在执行一个非常占用内存的操作对该机器上的整个表进行操作。看来 512Meg 还远远不够。
我在这里看到的一个更基本的问题:您正在一个与生产环境非常不同的环境中进行开发(并且很可能也进行测试)。您所解释的问题类型是可以预料的。您的开发机器的内存是生产机器的六倍。我相信我可以有把握地说,处理器也更快。在这种情况下,我建议您创建一个模仿您的生产站点的虚拟机。这样您就可以轻松测试您的项目,而无需中断生产站点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)