添加索引非常慢...是否有MySQL cmd可以获取ETA或显示进度?


13

我目前正在我的表(20M个条目)上运行一个alter查询,以添加索引。它已经运行了3天以上(停留在“复制到tmp表”中)。

有什么办法可以查看查询的进度,换句话说,有没有办法可以估计完成时间?

谢谢。


4
MyISAM?InnoDB?如果是InnoDB,是否按表打开文件?
查尔斯

伟大的问题-我能立即想到的最好的事情是使用原始临时文件和实际文件的大小做一个大概的猜测-尽管会做更多的研究

SHOW CREATE TABLE tblname\G在桌子上告诉我们您要制作的索引。
RolandoMySQLDBA 2012年

Answers:


3

当mysql更改一个表时,它实际上会复制它,然后交换该副本。这样,如果您在中间取消更新,则该表仍处于稳定状态。因此,您可以在mysql数据目录(/ var / lib / mysql /?)中查看新文件的大小,这将告诉您文件的长度。对于Innodb,这有点困难,但是在某个地方创建了一个tmp表。

通过增加排序缓冲区变量(myisam_sort_buffer_size,sort_buffer_size),可以显着减少索引花费的时间。利用您的内存使这些尽可能大。您可以将修改时间减少几天,甚至可以减少到几个小时,具体取决于您有多少内存。我在大约3个小时内完成了150M记录表。


不幸的是,我找不到任何tmp表。我使用innoDB,并将innodb_file_per_table设置为OFF。

2

由于innodb_fle_per_table为OFF,因此您无法看到该表并无法衡量进度。

我之前发表了一篇有关如何为MyISAM执行此操作的帖子。仅当启用innodb_file_per_table并且重新构造InnoDB基础结构时,才能对InnoDB执行此操作。仍然需要在操作系统中查看相关文件的大小。

完全实现InnoDB清理并启用innodb_file_per_table后,您可能需要执行以下索引更新:

示例您有以下内容

  • 使用/ var / lib / mysql作为datadir的MySQL实例
  • db.lotsofdata用2000万个名字调用的InnoDB表:

该表如下所示:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

假设您要创建一个名称索引。你可以这样做:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

INSERT运行时,您进入操作系统并运行以下命令:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

这将为您提供当前大小的清单lotsofdata_new.ibd。当它变得大于时lotsofdata.ibd,您就知道您即将完成。

BTW MariaDB具有内部实现的进度状态


感谢您的反馈。现在,我决定终止查询,并在升级到最新的mysql版本后重试。希望这样会更顺利。
阿泰伏尔泰

1

没有可靠的方法来查看索引创建的进度。如果启用了innodb-per-per-table,则可以通过查看在数据目录中创建的临时.ibd文件并将其与当前文件的大小进行比较来获得一些提示,但这不是非常好可靠,因为您当前的数据文件可能会由于删除/碎片而膨胀,并且新数据文件将具有您以前的数据文件没有的其他索引。

听起来您正在使用未安装InnoDB插件的MySQL版本。InnoDB插件具有快速的索引创建功能,不需要为索引添加和删除而完全重建表。InnoDB插件默认在MySQL 5.5中启用,并且在5.1.38及更高版本中具有配置设置。

  • 您正在使用哪个版本的MySQL?

Percona Server在相当程度上(5.5之前)支持默认启用InnoDB插件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.