mysql - 如何使用INSERT ... SELECT语法进行大查询

时间:2016-09-21 13:04:04

标签: mysql sql

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

以下是我的表格:

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

提前致谢。

0 个答案:

没有答案