繁体   English   中英

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

[英]mysql zero downtime ALTER table sorting (percona, openark, etc)

我需要以某种方式对巨大的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复制期间进行排序,如“在INERT _mytable_new SELECT * FROM mytable ORDER BY col1,col2中插入”一样吗?
  3. 或者也许“ ORDER BY”永远不会完成?

编辑:我在测试服务器上启动了PTDEBUG=1 ./pt-online-schema-change --alter "ENGINE=MyISAM, ORDER BY col1, col2"

检查日志后,我发现未应用“ ORDER BY” ...有什么想法吗? openark允许这样做吗?

谢谢!

有一种方法可以通过pt-online-schema-change实现ORDER BY。

首先,请确保您要ORDER BY的列上有一个索引。 然后将percona工具与选项“ --chunk-index”一起使用,以便使用所选的索引来获取原始表中的行。

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

大型的100M行表分散了我10倍的内存。 没有列排序的OPTIMIZE表不能改善这种情况,因为值随机分布在8GB的表中。 我希望这一发现对其他人有帮助。

暂无
暂无

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

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