2016-02-29 59 views
2

我有一些大表,我想刪除一個符合以下命令SQL:刪除從表線,根據另一個,時間太長

當我嘗試這一點,它的時間太長:

DELETE global, lines 
FROM lines force index(cardIndex) 
INNER JOIN global force index(cardIndexes) 
      ON global.card = lines.card 
      WHERE lines.product NOT IN (SELECT code FROM article); 

我的表全局有900.000行,行表有6.000.000行,文章有40.000 任何想法可以做什麼來改善命令?

回答

1

NOT IN是非常昂貴的操作。你可以用這個替代消除它:

  • OUTER JOINarticle表,而是和
  • 僅包含那些行,其中article.code爲空。

null表示article表中沒有相應的記錄 - 換句話說:「不在」中。

DELETE global, lines 
FROM lines force index(cardIndex) 
INNER JOIN global force index(cardIndexes) ON global.card = lines.card 
LEFT JOIN article ON lines.product = article.code 
WHERE article.code IS NULL; 
+0

謝謝,但它仍然無法正常工作,在此查詢期間我失去了與mysql的連接。 – cdom