Mysql 插入不在表中的行

Mysql 插入不在表中的行,mysql,performance,Mysql,Performance,我正在使用这个查询,但它真的很慢 INSERT INTO a (b,c,d,e,f,g,h,i) SELECT b,c,d,e,f,g,h,i FROM z WHERE b NOT IN (SELECT b FROM a) is从表z中查找b不在表“a”中的所有记录,并将其导入表a 它真的很慢,而且一直在计时。有没有办法让它更快 多谢各位 大事 注意使b列唯一,然后使用选项插入,以便: INSERT IGNORE INTO a (b,c,d,e,f,g,h,i) SELE

我正在使用这个查询,但它真的很慢

   INSERT INTO a (b,c,d,e,f,g,h,i) SELECT b,c,d,e,f,g,h,i FROM z WHERE b NOT IN (SELECT b FROM a)
is从表z中查找b不在表“a”中的所有记录,并将其导入表a

它真的很慢,而且一直在计时。有没有办法让它更快

多谢各位 大事


注意

使
b
列唯一,然后使用选项插入
,以便:

   INSERT IGNORE INTO a (b,c,d,e,f,g,h,i)
     SELECT b,c,d,e,f,g,h,i FROM z
使用以下简单技巧:

INSERT INTO a (b,c,d,e,f,g,h,i) 
SELECT b,c,d,e,f,g,h,i 
FROM z
LEFT JOIN a on a.b = z.b
WHERE a.b IS NULL;

只有当
b
中没有匹配的行时,您才会得到一行,并且查询将能够有效地使用索引。

您是否检查了选择部分是否慢(例如通过运行它和/或通过研究explain select…)的输出?只是问一下,因为特别是在索引较多的表上,插入可能会相对较慢,这就是为什么在批量插入之前最好删除索引。您在
b
上有索引吗?(在两个表中)它们是InnoDB表还是MyISAM表?这将插入多少行?字段的类型是什么?如果
b
不能成为
唯一的
?那么至少在
a.b
z.b
上创建一个索引以加快比较我认为
不在
中,
不存在
左连接-为空
之间的性能(如果有)没有太大的差异。问题可能出在其他地方(不是索引表、大字段等)
   INSERT INTO a (b,c,d,e,f,g,h,i) SELECT b,c,d,e,f,g,h,i FROM z WHERE NOT EXISTS (SELECT 1 FROM a WHERE z.b = a.b)
INSERT INTO a (b,c,d,e,f,g,h,i) 
SELECT b,c,d,e,f,g,h,i 
FROM z
LEFT JOIN a on a.b = z.b
WHERE a.b IS NULL;