我需要以某种方式对一个巨大的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允许这样做吗?
谢谢!
答案 0 :(得分:0)
通过pt-online-schema-change实现ORDER BY的方法。
首先,确保您想要ORDER BY的列上有索引。然后使用percona工具和选项" - chunk-index"以便所选索引用于获取原始表中的行。
但是有一个问题。当指数选择性差时,Percona无法获取行。在这种情况下,使用您需要排序+ ID的列(例如,具有高基数的任何其他列)创建复合索引。会很慢,但可能是一种让你在线排序的方式。
我获得了10倍的提升,一张100M行的大表,非常碎片化。没有列排序的OPTIMIZE表没有改善情况,因为值随机分布在8GB的表中。我希望这一发现有助于其他人。