在MySQL中无限运行的INSERT

时间:2016-10-08 14:13:17

标签: mysql sql

我有一个奇怪的问题,我无法弄清楚。我不是一个MySQL人(更多的是SQL Server人员),而且我有一个INSERT语句,它正在运行(貌似)。

INSERT INTO voter_registration_v2.temp_address_map (person_id, address_id)
select person_id, address_id from 
voter_registration.voters v
inner join voter_registration_v2.address a
on  v.house_num = a.house_num
and v.half_code = a.half_code
and v.street_dir = a.street_dir
and v.street_name = a.street_name
and v.street_type_cd = a.street_type_cd
and v.street_sufx_cd = a.street_sufx_cd
and v.unit_designator = a.unit_designator
and v.unit_num = a.unit_num
and v.res_city_desc = a.res_city_desc
and v.state_cd = a.state_cd
and v.zip_code = a.zip_code;

SELECT本身在20s,16s运行以获取。当我使用INSERT运行时,我已经超时了6000秒。所有表都使用MyISAM引擎。我原本尝试过InnoDB,但它没有什么区别。它肯定是一个大插入 - 约600k记录。下面是临时表的CREATE。

CREATE TABLE temp_address_map (
    person_id       int     PRIMARY KEY,
    address_id      INT
);

然而,即使有600k - 如果SELECT只需要30秒,我无法想象INSERT需要100多分钟。感谢任何建议。

我注意到我本地安装MySQL的奇怪问题。一些需要0.5秒或更短时间的SELECT语句也会随机开始运行。我可以解决问题的唯一方法是卸载并重新安装服务器。在我放弃之前,我必须在论坛上浏览100条建议。它几乎像MySQL逐渐变慢,直到它无法使用。 (我的RAM约占48%)。有点奇怪,不确定这里发生了什么......

1 个答案:

答案 0 :(得分:3)

你是对的。在大多数情况下,select在20秒内返回的查询不应占用insert的小时数。但是,我要提醒您,您可能会根据返回的“第一行”计时select。在返回所有行之前,insert不会返回。

你有一个非常详细的on条款。我会建议在子句中使用的所有列上的复合索引(从最常规到最不常规):

create index idx_address_allkeys
    on address(state_cd, res_city_desc, zip, street_name, . . . );

换句话说,我猜你的代码是使用嵌套循环连接,一次返回一行。