如何在不影响生产性能的情况下将索引添加到18 GB innodb mysql表中?

时间:2010-07-18 06:58:01

标签: php mysql

如何在不影响生产性能的情况下为18 GB innodb mysql表添加索引?这个表经常被访问,我刚试过改变表,结果已经锁定了200多个查询,这对性能有害。还有其他方法吗?

3 个答案:

答案 0 :(得分:3)

TheOnly92 - 还有另一种选择,即使亚马逊和ebay也使用。如果网站无法接入,则不会被认为是“不良”的形式。在那些场合,你会看到一个404维护页面正在显示,用户友好的消息说该网站正在进行必要的升级......等等......

这可能是最实用的解决方案,因为创建此页面需要5分钟,而另一个选项可能需要花费很多时间来确定,还有更多需要实现。另外,由于这种情况很少发生,因此您的用户不太可能因此类消息或停机时间而被推迟。

吉姆

答案 1 :(得分:3)

另一种选择是使用pt-online-schema-change。它将使用新索引创建旧表的副本,并创建触发器,该触发器将反映从旧表到新表的所有更改。最后,它将更改旧表的名称。

答案 2 :(得分:2)

这取决于你不会丢失新记录的重要性吗?

使用CREATE TABLE ... LIKE ...复制表结构,将新索引添加到重复表中,执行INSERT INTO ... SELECT ... FROM ...以获取所有数据,然后运行一对ALTER以重命名旧表,然后将新表重命名为旧表的名称。

不幸的是,如果旧表中的任何数据在INSERT / SELECT运行和重命名表之间发生变化,则可能会丢失。可以使用one of the Maatkit tools来恢复数据以进行表格比较。

另一种常见模式依赖于重复的硬件。设置复制从站,在那里添加索引,然后使从站成为主站。

这些都不是很快,但它们可能比直接添加索引更快。但是,如果您能够承受停机时间,那么在改变/复制/切换从站时,您真的应该关闭系统。不必担心让数据重新同步会让您的生活更轻松。

(您可能希望考虑切换到lets you add indexes without locking the table的数据库。)