mysql-如何使用INSERT…;选择大型查询的语法

mysql-如何使用INSERT…;选择大型查询的语法,mysql,sql,Mysql,Sql,我正在处理一个非常大的数据库,我需要找到一种可靠的方法将表中的行插入到另一个表中,而不会出现崩溃或低空间错误 这是我的桌子: tld: 738 rows ============================ | id (int) | tld (varchar) | ============================ sld: 116,000,000 rows ============================ | id (int) | sld (varchar) | =====

我正在处理一个非常大的数据库,我需要找到一种可靠的方法将表中的行插入到另一个表中,而不会出现崩溃或低空间错误

这是我的桌子:

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`;
但现在我得到了一个低空间误差。 然后我使用重复语法将select查询分块:

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的历史记录表中?

提前谢谢