[英]MySQL (Percona 5.7) Slow ALTER table with InnoDB engine …?
[英]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表?
编辑:我在测试服务器上启动了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.