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;