我在mySQL上运行myISAM表,通过一些测试,我们发现通过添加某个复合索引可以极大地加快查询速度。到现在为止还挺好。但是,我并不是真正想要在生产环境中添加此索引而不长时间锁定表的最佳方法(它有27GB的数据,所以不是很多,但确实需要一段时间)。
你有什么提示吗?如果这是一个更复杂的设置,我们当然会有另一台机器上所有数据的实时复制品,我们可以安全地切换。不幸的是,我们还没有,我想尽快加快这个问题(这会引起很大的客户头痛)。是否有一些简单的方法来复制数据,然后做出换出技巧?我缺少一些其他技巧?
更新:阅读SQL Server中的“在线索引操作”让我非常嫉妒http://msdn.microsoft.com/en-us/library/ms191261.aspx:)
谢谢!
答案 0 :(得分: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。检查从站状态以确保主站和从站上的日志位置匹配。如果是这样,请关闭从属服务器并将该表的文件复制回主服务器。
答案 1 :(得分:1)
我和兰迪在一起。我们一直处于类似的情况,MySQL有两种方法可以实现这样的目标:
运行时取下服务器。这是你可能会做的。它很简单,很简单,很有效。时间到了吗?也许半小时/ 45分钟,取决于磁盘带宽。见下文。
使用新索引创建一个新表,复制所有数据,暂停服务器删除第一个表,将新表更改为旧名,启动服务器。停机时间?也许10分钟,但真的很复杂。
选项2有效,可以节省创建索引的停机时间(如果需要很长时间)。但它需要更多的空间,它更复杂(因为你必须处理从主表插入的新记录,并且它可能会在复制数据时锁定MyISAM。删除表将需要一些时间,将表更改为新名称需要一些时间。这真的很复杂。如果你有一个2TB表,这可能是有用的,但对于27G它可能有点过分。
您的第二台服务器是否与生产服务器的规格接近?加载最近的备份并在那里执行索引,以便了解添加所需的时间。然后计划停机时间。
InnoDB在许多方面做得更好,但新索引仍然锁定了表格。那些MSSQL(我认为PostgreSQL)必须在没有锁定的情况下做这些事情的能力会很棒。
答案 2 :(得分:0)
找到您的低使用率窗口,并在索引构建期间使您的应用程序脱机。由于你没有复制或多主机或其他任何东西,你只需要在这一个上咬紧牙关。凌晨1点见。 : - )
答案 3 :(得分:0)
在这里,您只能使用一台服务器。
如果您复制桌子并进行干运行,至少你会发现在不锁定直播桌的情况下需要多长时间,所以你可以在必要时安排一些维护时间,或者决定你是否可以只需按下按钮,让用户暂停几分钟:)
或安排一段安静的时间......
at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'