Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果记录不存在需要很长时间,则从其他表插入_Mysql_Sql_Select_Insert - Fatal编程技术网

Mysql 如果记录不存在需要很长时间,则从其他表插入

Mysql 如果记录不存在需要很长时间,则从其他表插入,mysql,sql,select,insert,Mysql,Sql,Select,Insert,我正在执行从一个表到另一个表的插入查询。 查询如下所示: 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

我正在执行从一个表到另一个表的插入查询。 查询如下所示:

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

试着这样做也许对你有帮助

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)

由于以下原因,您的查询速度较慢:

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

正如评论中指出的,您没有指定数据库引擎。这很重要。有些数据库支持密钥,此处使用的除外。其他人支持关键字减号。可能还有其他人两者都不支持。

嗨,丹·布拉库克,谢谢你的帮助,我正在使用MySQL,我认为它不支持“expect”。谢谢你的快速回答,阿米特,但是这个查询仍然像原始查询一样运行很长时间。你在
分析用户
表中的
用户id
列上有索引吗?您的问题并发布分析用户显示索引的结果。查看问题“有更好的方法吗?”,不这样做如何?为什么不简单地使用用户表中的数据?@DanBracuk区别就像表名one用于分析,它添加了更多列以获取用户的报告,所以分析用户表对我来说是必要的。那么你想要的就是用户id。你可以通过连接两个表来获得诸如姓名和电子邮件地址之类的信息。那么执行计划是怎么说的呢?