我正在处理一个非常大的数据库,我需要找到一种值得信赖的方法来将表的行插入另一个表中,而不会出现崩溃或空间不足的错误。
以下是我的表格:
tld: 738 rows
============================
| id (int) | tld (varchar) |
============================
sld: 116,000,000 rows
============================
| id (int) | sld (varchar) |
============================
dns: 3,000,000 rows
============================
| id (int) | dns (varchar) |
============================
cache: 300,000,000 rows --temp data
===============================================================
| sld (varchar) | tld (varchar) | dns (varchar) | date (date) |
===============================================================
history: 128,000,000 rows
===================================================
| sld (int) | tld (int) | dns (int) | date (date) |
===================================================
正如您所看到的,临时数据有一个缓存表。
我在三个表(sld, tld, dns)
中插入缓存列(sld, tld, dns)
并获取他们的ID以供以后使用以下sql:
INSERT INTO `sld` (`sld`)
SELECT DISTINCT `sld` FROM `cache`
WHERE `sld` NOT IN (SELECT `sld` FROM `sld`);
之后,我想将所有缓存数据插入到历史表中,并附带关联的ID。 我运行了这个查询:
INSERT INTO `history` (`sld`, `tld`, `dns`, `date`)
SELECT DISTINCT * FROM (
SELECT `sld`.`id` AS `sld`, `tld`.`id` AS `tld`, `dns`.`id` AS `dns`, `cache`.`date` AS `date` FROM `cache`, `sld`, `tld`, `dns`
WHERE `cache`.`tld` = `tld`.`tld` AND `cache`.`sld` = `sld`.`sld` AND `cache`.`dns` = `dns`.`dns`
) AS `t`;
但是现在我得到了一个低空间错误。 然后我用重复语法将我的选择查询分块:
REPEAT
DROP TABLE IF EXISTS `tmp_cache`;
CREATE TEMPORARY TABLE `tmp_cache`
SELECT `sld`.`id` AS `sld`, `tld`.`id` AS `tld`, `dns`.`id` AS `dns`, `cache`.`date` AS `date` FROM `cache`, `sld`, `tld`, `dns`
WHERE `cache`.`tld` = `tld`.`tld` AND `cache`.`sld` = `sld`.`sld` AND `cache`.`dns` = `dns`.`dns`
LIMIT 1000000;
INSERT INTO `history` (`sld`, `tld`, `dns`, `date`) SELECT DISTINCT * FROM `tmp_cache`
ON DUPLICATE KEY UPDATE `history`.`date` = `history`.`date`;
UNTIL (SELECT count(*) FROM `tmp_cache`) = 0
END REPEAT;
使用这种方法我还有一些其他问题: 并发或更改订单会影响我的数据......
如何在不降低空间错误的情况下,将缓存表放入包含关联ID的历史记录表中?
提前致谢。