繁体   English   中英

在实时myISAM表上添加索引的最简单方法是什么?

[英]What's the easiest way to add an index on a live myISAM table?

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

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

更新:阅读有关SQL Server中的“联机索引操作”使我非常嫉妒http://msdn.microsoft.com/zh-cn/library/ms191261.aspx :)

谢谢!

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

要设置从属服务器,请参见http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

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

一旦您启动并运行了从属服务器,并确认一切都可以正确复制 ,则可以暂停该从属服务器 在从属服务器上创建索引。 索引创建完成后,恢复从站。 这将使奴隶追上主人。 在主服务器上,使用带读锁的FLUSH TABLE。 检查从站状态,以确保主站和从站上的日志位置匹配。 如果这样做,请关闭从属服务器并将该表的文件复制回主服务器。

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

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

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

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

您是否有第二台服务器的规格与生产服务器相近? 加载最新的备份并在其中进行索引,因此您知道添加需要多长时间。 然后计划停机时间。

InnoDB在很多方面都比较好,但是新索引仍然可以锁定表。 MSSQL(我认为是PostgreSQL)必须具有此类功能而无需锁定的那些功能将是很棒的。

查找低使用率窗口,并使索引构建过程中的应用程序脱机。 由于您没有复制,多主机或任何其他功能,因此您只需要在这上面硬着头皮。 凌晨1点见。 :-)

您在这里只能在一台服务器上做很多事情。

如果您复制表并进行空运行,至少您会发现要花多长时间而不锁定活动表,因此您可以在必要时安排一些维护时间,或决定是否可以按按钮,让用户挂了几分钟:)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM