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 回答