mysql零停机时间ALTER表排序(percona,openark等)

时间:2014-03-17 12:02:18

标签: mysql percona

我需要以某种方式对一个巨大的MyISAM表进行排序,以便SELECT在某些条件下更快。

请注意,此问题是关于如何使用零停机时间执行ALTER表以按特定列顺序对表进行排序。对于更普遍的案例,这不是其他问题的重复问题。

实现这一目标的一种简单方法是做这样的事情:

ALTER table mytable ORDER BY col1, col2;

我们也可以使用myisamchk --sort-records来获得相同的结果。

无论如何,这两种方法都让我们做得很快:

SELECT * WHERE col1=x order by col2;

请注意,这不是索引的问题,而是从表中获取大量有序数据。

到目前为止,ALTER一直运作良好。现在的问题是ALTER命令很慢并且它锁定了数据库。

我相信我们可能会使用percona或openark工具进行相同的操作。像这样:

pt-online-schema-change --alter "ENGINE=MyISAM, ORDER BY col1, col2" D=mydatabase,t=mytable -u root --dry-run

这在内部创建一个新表,然后复制它,然后移动名称。记录非常清楚。

但是,我不确定percona是否/如何尊重" ORDER BY"。我看不到干运行日志中发生的任何事情(但这可能是正常的)。这在文档中没有解释。

有谁知道percona ORDER BY表格怎么样?

  1. 在复制mytable之后和重命名之前,是否会对新表(_mytable_new)进行排序?
  2. 是否会在mytable的复制过程中进行排序,如在" INSERT INTO _mytable_new SELECT * FROM mytable ORDER BY col1,col2"?
  3. 或许" ORDER BY"永远不会完成?
  4. 编辑:我在测试服务器上启动了PTDEBUG=1 ./pt-online-schema-change --alter "ENGINE=MyISAM, ORDER BY col1, col2"

    检查完日志后,我发现" ORDER BY"没有被应用......任何想法? openark允许这样做吗?

    谢谢!

1 个答案:

答案 0 :(得分:0)

通过pt-online-schema-change实现ORDER BY的方法。

首先,确保您想要ORDER BY的列上有索引。然后使用percona工具和选项" - chunk-index"以便所选索引用于获取原始表中的行。

但是有一个问题。当指数选择性差时,Percona无法获取行。在这种情况下,使用您需要排序+ ID的列(例如,具有高基数的任何其他列)创建复合索引。会很慢,但可能是一种让你在线排序的方式。

我获得了10倍的提升,一张100M行的大表,非常碎片化。没有列排序的OPTIMIZE表没有改善情况,因为值随机分布在8GB的表中。我希望这一发现有助于其他人。