我使用這個查詢,但它真的很慢插入行,是不是在一個表
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
附:
我使用這個查詢,但它真的很慢插入行,是不是在一個表
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
附:
充分利用b
列的唯一,那麼INSERT
與IGNORE
選項,所以:
INSERT IGNORE INTO a (b,c,d,e,f,g,h,i)
SELECT b,c,d,e,f,g,h,i FROM z
如果'b'不能做'UNIQUE'會怎麼樣? –
然後至少在''ab''和''zb''上創建一個索引來加速比較 –
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
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;
你只會得到一個當b
中沒有匹配的行時,該行就可以進行查詢了有效地使用索引。
我認爲'NOT IN','NOT EXISTS'和'NOT IN'之間的性能差別不大(如果有的話)和'LEFT JOIN - IS NULL'。問題可能在別處(不是索引表,大尺寸字段,...) –
您是否檢查過select部分是否緩慢(例如通過運行它和/或通過研究explain select的輸出)?只是問,因爲特別是在索引嚴重的表插入可能會相對較慢,這就是爲什麼在批量插入之前,刪除索引是一個好主意。 – fvu
你有'b'上的索引嗎? (在這兩個表中) –
他們是InnoDB還是MyISAM表? –