如何更新25 GB的大型表,超过3.5亿条MyISAM记录? 我需要在time
字段中为所有记录设置一个随机日期。在没有负荷的服务器,命令被执行:如何更新25 GB的大型表,超过3.5亿条MyISAM记录?
UPDATE table SET time = FROM_UNIXTIME(1451595600 + FLOOR((RAND() * 31536000)))
mysqld的加载处理器和占用了大量的内存,在上午的负载服务器是最小的,但所有执行查询,超过55小时过去了。
我不明白这是怎么回事!
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`job_id` int(10) unsigned NOT NULL,
`lock` mediumint(6) unsigned DEFAULT '0',
`time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `job_id` (`job_id`),
KEY `lock` (`lock`),
KEY `time` (`time`)
) ENGINE=MyISAM;
地址:
[email protected]:~ # iostat -p md1 60 5
解决:
我打断更新过程。
除主删除索引:
MariaDB [base]> ALTER TABLE `table` DROP INDEX `job_id`, DROP INDEX `lock`, DROP INDEX `time`;
Query OK, 339468609 rows affected (1 hour 3 min 28.89 sec)
Records: 339468609 Duplicates: 0 Warnings: 0
更新`time`字段:
MariaDB [base]> UPDATE `table` SET `time` = FROM_UNIXTIME(1451595600 + FLOOR((RAND() * 31539599)));
Query OK, 339468609 rows affected (16 min 8.09 sec)
Rows matched: 339468609 Changed: 339468609 Warnings: 0
添加索引:
MariaDB [base]> ALTER TABLE `table` ADD INDEX (`job_id`), ADD INDEX (`lock`), ADD INDEX (`time`);
Query OK, 339468609 rows affected (2 hours 18 min 58.32 sec)
Records: 339468609 Duplicates: 0 Warnings: 0
总更新时间:3小时38分钟35.3秒
对不起,但你的问题很难理解。请更确切地说:_查询查询是否正确结束?列是否已更新? – arkascha
这张表上的索引可能很有意思。请将关于创建表和索引的信息添加到问题中。 – arkascha
表格仍在更新中,但我担心已经很长时间了。此时大部分时间服务器未加载 – Dmitry