0

我有一个在 mySQL 上运行的 myISAM 表,通过进行一些测试,我们发现我们可以通过添加某个复合索引来极大地加快查询速度。到现在为止还挺好。但是,我并不是在不长时间锁定表的情况下在生产环境中添加此索引的最佳方法(它有 27GB 的数据,所以不多,但确实需要一段时间)。

你有什么建议吗?如果这是一个更复杂的设置,我们当然会在另一台机器上拥有所有数据的实时副本,我们可以安全地切换。不幸的是,我们还没有到那里,我想尽快加快这个查询(这引起了客户的大麻烦)。是否有一些简单的方法来复制数据然后进行交换技巧?我还缺少其他一些技巧?

更新:阅读 SQL Server 中的“在线索引操作”让我非常嫉妒http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

谢谢!

4

4 回答 4

3

您可以使用复制来获得大约几分钟的停机时间,而不是在该表上创建索引可能需要几个小时。

要设置从站,请参阅http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

在第 2 步中,我可以提出帮助加快流程的建议,遵循“使用原始数据文件创建数据快照”方法。但不是通过线路复制到从站,而是复制到主站上的不同位置。并在复制完成后立即恢复主服务器,并且您已对配置文件进行了必要的更改(设置服务器 ID 并启用二进制日志记录)。这会将您的停机时间减少到一两分钟。一旦服务器备份,您可以将复制的文件复制到从机。

once you have the slave up and running and you have verified everything is replicating properly, you can pause the slave. create the index on the salve. when the index creation is complete, resume the slave. this will catch the slave up to the master. on the master, use FLUSH TABLE WITH READ LOCK. check the slave status to make sure the log position on the master and the slave match. if they do, shut down the slave and copy the files for that table back to the master.

于 2009-10-21T16:25:48.420 回答
1

我和兰迪在一起。我们也遇到过类似的情况,在 MySQL 中有两种方法可以完成这样的事情:

  1. 在服务器运行时关闭它。这就是你可能会做的。这很简单,很容易,它有效。有时间做吗?可能需要半小时/45 分钟,具体取决于磁盘带宽。见下文。

  2. 用新索引创建一个新表,复制所有数据,暂停服务器删除第一个表,将新表更改为旧名称,启动服务器。停机时间?10分钟,也许,但真的很复杂。

选项二有效,并为您节省了创建索引的停机时间(如果需要很长时间)。但它占用更多空间,更复杂(因为您必须处理从主表插入的新记录,并且它可能会在复制数据时锁定 MyISAM。删除表需要一些时间,将表更改为新名称需要一些时间。这真的很复杂。如果你有一个 2TB 的表,这可能很有用,但对于 27G 来说,这可能是矫枉过正。

您是否有第二台服务器在规格上接近您的生产服务器?加载您最近的备份并在那里进行索引,这样您就知道添加需要多长时间。然后计划停机时间。

InnoDB 在很多方面都做得更好,但新索引仍然会锁定表。MSSQL(我认为是 PostgreSQL)必须在没有锁定的情况下做这些事情的能力会很棒。

于 2009-10-21T16:01:40.057 回答
0

在索引构建期间找到您的低使用率窗口并让您的应用程序脱机。由于您没有复制或多主机或其他任何东西,因此您将不得不在这个上硬着头皮。凌晨 1 点见。:-)

于 2009-10-21T15:55:32.610 回答
0

在这里,一台服务器无能为力。

如果您复制表格并进行试运行,至少您会发现在不锁定实时表格的情况下需要多长时间,因此您可以在必要时安排一些维护时间,或者决定是否可以只推按钮,让用户等待几分钟 :)

或者安排一个安静的时间...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
于 2009-10-21T16:00:31.887 回答