我有一个奇怪的问题,我无法弄清楚。我不是一个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%)。有点奇怪,不确定这里发生了什么......
答案 0 :(得分:3)
你是对的。在大多数情况下,select
在20秒内返回的查询不应占用insert
的小时数。但是,我要提醒您,您可能会根据返回的“第一行”计时select
。在返回所有行之前,insert
不会返回。
你有一个非常详细的on
条款。我会建议在子句中使用的所有列上的复合索引(从最常规到最不常规):
create index idx_address_allkeys
on address(state_cd, res_city_desc, zip, street_name, . . . );
换句话说,我猜你的代码是使用嵌套循环连接,一次返回一行。