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。你可以通过连接两个表来获得诸如姓名和电子邮件地址之类的信息。那么执行计划是怎么说的呢?