0

あるテーブルから別のテーブルへの挿入クエリを実行しています。クエリは次のようになります。

INSERT INTO analytics_user (brokerage_id, email, first_name, last_name, landing_page_source, sign_up_time, user_id) 
  SELECT brokerage_id, email, first_name, last_name, landing_page_source, sign_up_time, user_id 
  FROM user  
  WHERE user_id NOT IN 
    (SELECT user_id FROM analytics_user);

ユーザーテーブルに 1M のレコードがありますが、それを行うより良い方法はありますか? 完了までに 20 分以上かかるか、フリーズしてサーバーを再起動する必要があるためです。

アップデート:

analytics_user からのインデックスを表示

analytics_user  0   PRIMARY 1   id  A   10687   NULL    NULL        BTREE   
analytics_user  0   brokerage_id    1   brokerage_id    A   10687   NULL    NULL        BTREE   
analytics_user  0   user_id 1   user_id A   10687   NULL    NULL        BTREE   
4

2 に答える 2

0

これにより、クエリが遅くなります。

WHERE user_id NOT IN 
(SELECT user_id FROM analytics_user);

その構造は非常に直感的ですが、常に遅いです。このようなものが良いです:

WHERE user_id IN 
(SELECT user_id FROM
user
except
SELECT user_id FROM analytics_user);

コメントで指摘されているように、データベースエンジンを指定していません。それは重要です。一部のデータベースは、ここで使用されているキー except をサポートしています。他の人はキーワードマイナスをサポートしています。どちらもサポートしない人もいるかもしれません。

于 2013-11-05T17:21:35.980 に答える
0

このようにしてみてください

INSERT INTO analytics_user
(brokerage_id, email, first_name, last_name, landing_page_source, sign_up_time, user_id) 
(
SELECT 
brokerage_id, email, first_name, last_name, landing_page_source, sign_up_time,
     user_id 
FROM user A 
Left join analytics_user b on A.User_Id=B.User_Id
 where B.User_Id is null)
于 2013-11-05T17:15:12.460 に答える