2011-08-31 54 views
0

我使用這個查詢,但它真的很慢插入行,是不是在一個表

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) 

是什麼做的是找到所有記錄,其中b未在表中「一」從表z和將它導入到表a中。

它真的很慢,並保持時間。有沒有讓它更快?

感謝信 BigThings

附:

+1

您是否檢查過select部分是否緩慢(例如通過運行它和/或通過研究explain select的輸出)?只是問,因爲特別是在索引嚴重的表插入可能會相對較慢,這就是爲什麼在批量插入之前,刪除索引是一個好主意。 – fvu

+0

你有'b'上的索引嗎? (在這兩個表中) –

+0

他們是InnoDB還是MyISAM表? –

回答

1

充分利用b列的唯一,那麼INSERTIGNORE選項,所以:

INSERT IGNORE INTO a (b,c,d,e,f,g,h,i) 
    SELECT b,c,d,e,f,g,h,i FROM z 
+0

如果'b'不能做'UNIQUE'會怎麼樣? –

+0

然後至少在''ab''和''zb''上創建一個索引來加速比較 –

0
INSERT INTO a (b,c,d,e,f,g,h,i) SELECT a.b,a.c,a.d,a.e,a.f,a.g,a.h,a.i FROM z,a WHERE z.b != a.b 
0
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) 
0

使用這個簡單的把戲:

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中沒有匹配的行時,該行就可以進行查詢了有效地使用索引。

+0

我認爲'NOT IN','NOT EXISTS'和'NOT IN'之間的性能差別不大(如果有的話)和'LEFT JOIN - IS NULL'。問題可能在別處(不是索引表,大尺寸字段,...) –

相關問題