0

の中に

`synchro_newitems`

テーブル私はすべての新しいアイテム(外部ソースから)〜約500k行を持っています。1つの列があります:

`new_ids`

の中に

`synchro_olditems`

テーブル私はすべての現在のアイテム(これも外部ソースからのもの)を持っています〜約500k行。1つの列があります:

`old_ids`

私はから新しいアイテムだけを入手しなければなりませんsynchro_newitems

(新商品)= synchro_newitems(-)synchro_olditems

3番目のテーブルに違いを挿入してそれを試してみました:

INSERT INTO `synchro_diff` (`id`) 
SELECT DISTINCT new_ids FROM synchro_newitems 
LEFT JOIN 
synchro_olditems ON synchro_newitems.new_ids = synchro_olditems.old_ids 
WHERE synchro_olditems.old_ids IS NULL

(「NOTIN」と同様)

少量の行で機能します。ただし、比較する行が500 000ある場合は、失敗します。

私は簡単に試しました:

DELETE FROM synchro_newitems WHERE exists(SELECT * FROM synchro_olditems)

しかし、それはうまくいきません..あなたはそれを行うためのいくつかの賢い方法を知っていますか?

4

1 に答える 1

1

これはmysqlクエリの奇妙さです。これを試して:

select distinct new_ids
from synchro_newitems n
where not exists (select 1 from synchro_olditems o where n.new_ids = old.old_ids)

これにより、最適化が向上します。そして、さらに良いことに、o.old_idsにインデックスを付けて、高速に処理できるようにします。

于 2012-08-17T15:54:42.837 に答える