2016-10-08 2 views
1

私にはわからない奇妙な問題があります。私はMySQLの人(SQL Serverの人)の多くではなく、(一見)永遠に実行されているINSERTステートメントがあります。MySQLで無限に実行される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自体はフェッチするために20秒、16秒で実行されます。私がINSERTを実行すると、私は6000時にタイムアウトしました。すべてのテーブルがMyISAMエンジンを使用しています。私はInnoDBを元々試みましたが、違いはありませんでした。それは間違いなく大きなインサートです - 約600kレコード。以下は、一時表のCREATEです。

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

しかし、600kの場合でも、SELECTに30秒しかかからない場合、INSERTが100+分かかるとは想像できません。提案を感謝してください。

とにかくローカルインストールで奇妙な問題が発生しています。 .5秒以下をランダムに実行するSELECT文も、永遠に実行され始めました。問題を解決できるのは、サーバーをアンインストールして再インストールすることだけでした。私が諦める前に、フォーラムで100件の提案を実行したに違いありません。それはMySQLが使い尽くされるまで、徐々に遅くなるのとほぼ同じです。 (私のRAMは約48%使用されています)。奇妙なことは、ここで何が起こっているのかわからない...

答えて

3

あなたは正しい。ほとんどの場合、insertでは20秒に返されるselectクエリに時間がかかりません。しかし、返される「最初の行」に基づいてselectのタイミングを取っている可能性があるので注意してください。 insertは、すべての行まで返されます。

あなたは非常に詳細なon句を持っています。私は(少なくとも一般的に最も一般的なものから始まる)句で使用されるすべての列にコンポジット索引を示唆している。言い換えれば

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

を、私は、あなたのコードは、ネステッド・ループを使用していることを推測しています時刻に1行戻します。

+1

PERFECT !, INSERTで16秒になりました。ありがとうございました。 @ kaledev。 – kaledev

+0

。 。クール。少なくとも99.7%の改善。 –

関連する問題