2009-10-21 69 views
0

我有一个在mySQL上运行的myISAM表,我们发现通过添加一个特定的复合索引,我们可以极大地加快查询的速度。到现在为止还挺好。然而,我并没有真正想要在生产环境中添加此索引的最佳方式,而不需要很长时间锁定表(它有27GB的数据,所以没有那么多,但它需要一段时间)。在真实的myISAM表上添加索引的最简单方法是什么?

您有任何提示吗?如果这是一个更复杂的设置,我们可以在另一台机器上生成所有数据的实时副本,并且我们可以安全地切换。不幸的是,我们还没有到位,我希望尽快加快这个查询(这导致客户头疼)。有没有一些简单的方法来复制数据,然后做一个换出技巧?我错过了一些其他的技巧?

UPDATE:在SQL Server中阅读有关 “联机索引操作” 让我很嫉妒http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

谢谢!

+0

你可以限制对数据库的写访问吗? – 2009-10-21 15:52:15

回答

3

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

设立奴隶,看http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

建议我可以帮助加快这一进程在步骤2中遵循“创建数据快照使用原始数据文件”的方法。但不是通过电线复制到从属设备,而是复制到主设备上的其他位置。并在复制完成后尽快恢复主服务器,并且已经对配置文件进行了必要的更改(设置server-id和启用的二进制日志记录)。这将使您的停机时间缩短到一两分钟。一旦服务器备份完毕,您可以将复制的文件复制到从机盒。

一旦你的奴隶启动并且你有verified everything is replicating properly,你可以pause the slave。在药膏上创建索引。当索引创建完成时,恢复从机。这将抓住主人的奴隶。在主设备上,使用FLUSH TABLE WITH READ LOCK。检查从站状态以确保主站和从站的日志位置匹配。如果他们这样做,关闭从站并将该表的文件复制回主站。

0

找到您的低使用率窗口,并在索引编译期间让您的应用程序脱机。既然你没有复制或者多任务或者其他的东西,你只能在这个上面咬一口。凌晨1点见。 :-)

0

这里没有太多你可以用一台服务器做。

如果您复制表格并进行空运行,至少您会发现在不锁定实时表的情况下需要多长时间,因此您可以根据需要安排一些维护时间,或者做出决定,无论您只需按下按钮,让用户挂了几分钟的:)

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

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)' 
1

我和兰迪。我们一直处于类似的情况,MySQL有两种方式来完成这样的事情:

  1. 运行时取下服务器。这是你可能会做的。这很简单,它很容易,它的工作原理。该做什么了?也许半小时/ 45分钟,取决于磁盘带宽。见下文。

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

选项二的作品,并节省您创建索引(如果它需要很长时间)的停机时间。但是它需要更多的空间,更复杂(因为你必须处理从主表插入的新记录,并且它可能会在复制数据时锁定MyISAM。删除表需要一些时间,将表更改为新的名字需要一些时间,这真的很复杂,如果你有一个2TB的表,这可能是有用的,但对于27G,它可能是过度杀伤性的。 ?加载最近的备份并在那里做索引,以便知道需要多长时间才能添加。然后计划停机时间。

InnoDB对许多事情都比较好,但是新索引仍然锁定表。 MSSQL(我认为PostgreSQL)必须具备这些功能没有锁定的东西会很棒。

相关问题