gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:31:46 26 4
gpt4 key购买 nike

我需要以某种方式对一个巨大的 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如何按表排序?

  1. 复制 mytable 之后、重命名之前,它会在新表 (_mytable_new) 上进行排序吗?
  2. 它会在从 mytable 复制期间进行排序,如“INSERT INTO _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 的列有索引。然后使用带有选项“--chunk-index”的percona工具,以便使用所选索引来获取原始表中的行。

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

使用一个包含 100M 行且非常分散的大表,性能提升了 10 倍。不进行列排序的 OPTIMIZE 表并没有改善这种情况,因为值随机分布在 8GB 的​​表中。我希望这一发现对其他人有帮助。

关于mysql零停机ALTER表排序(percona、openark等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22453773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com