如何更新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