【问题标题】:INSERT FROM other table if the record not exists taking long time如果记录不存在,则从其他表插入需要很长时间
【发布时间】:2013-11-16 15:59:16
【问题描述】:

我正在从一个表插入查询到另一个表。 查询如下:

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   

【问题讨论】:

  • 您在analytics_user 表中的user_id 列上有索引吗? Edit您的问题并发布SHOW INDEX FROM analytics_user的结果。
  • 看这个问题,“有没有更好的方法可以做到这一点?”,不做呢?为什么不简单地使用用户表中的数据?
  • @DanBracuk 区别就像表名一个是用于分析的,它添加了更多的列来获取用户的报告,所以analytics_user表对我来说是必要的。
  • 那么你想要的只是user_id。您可以通过连接这两个表来获取姓名和电子邮件地址等信息。
  • 那么执行计划是怎么说的呢?

标签: mysql sql select insert


【解决方案1】:

试试这样可能对你有帮助

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)

【讨论】:

  • 感谢您的快速回答,Amit,但此查询仍然像原始查询一样运行很长时间。
【解决方案2】:

因为这个原因,您的查询很慢:

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);

正如 cmets 指出的那样,您没有指定数据库引擎。这很重要。一些数据库支持键 except,这里使用它。其他人支持关键字减号。可能还有其他人不支持。

【讨论】:

  • 嗨,Dan Bracuk,感谢您的帮助,我正在使用 MySQL,但我认为它不支持“expect”。
猜你喜欢
  • 2011-06-06
  • 2017-05-16
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多