2011-08-17 4 views
1

重複している可能性のあるデータをテーブルに書きたいとします。私はコードでこれを数回行います。したがって、初めてそれがは、NOT EXISTS関数がUNIONよりもはるかに高価ですか?

INSERT INTO A (SELECT * FROM B) 

であり、第2の時間は、再挿入は3回の合計で行われる

INSERT INTO A 
SELECT * FROM C 
WHERE NOT EXISTS (SELECT * FROM A Where A.field = C.field) 

あります。私は4つのサブテーブルのUNIONを使用してコードを1つの挿入に変更することができましたが、再設計がたくさん必要になるので、今すぐ受信しているパフォーマンスペナルティを知りたがっています

ありがとう!!

+0

http:// stackoverflow。/ 7077172/if-mysql-db-table-does-not-row-with-specific-id-add-data-to-the-table/7077314 – nobody

答えて

1

おそらく、組合にはコストがかかりません。しかし、データベースの通常のように、はそれに依存します

なぜですか?

何あなたが今やっていることはこれですので:スキャンテーブルB

    1. とA.
    2. スキャンテーブルCに挿入し、(存在しない)Aに挿入します。
    3. テーブルDをスキャンし、Aに挿入します(存在しない場合)。あなたがこれをやってしまう組合と

    1. スキャンテーブルB
    2. スキャンテーブルC.
    3. スキャンテーブルD.
    4. 挿入し、ユニークな値のテーブルA.

    e現在のクエリは、テーブルB、C、DおよびテーブルAを3回の別々のクエリに対して2回のオーバーヘッドでスキャンします。ユニオンクエリーは、テーブルB、C、Dをスキャンして行をソートし(ユニークな値を取得するために)、テーブルAに挿入します。一見すると、より少ないスキャンを2回実行しているため、 1つのインサートのみ(したがって、より少ないロック)。それは依存私はによって意味

    は次のとおりです。

    インデックス:正しくインデックスを付け、目指すは、データの量

    B、CおよびDからのデータをソートするよりも速いかもしれません:あなたの場合データベースを実行しているハードウェアと比較してデータがほとんどない場合、このディスカッションは無意味かもしれません。私。ボトルネックではない部品の最適化には何の意味もありません。

  • +0

    ありがとう、これは非常に役に立ちました:) –

    0

    宛先表に適切なUNIQUE KEY制約がある場合でも、INSERT IGNORE ...を参照してください。

    ちょっと別のアイデア...パフォーマンスの違いは考えられませんが、おそらくあなたのテーブル構造、インデックス、データによって決まります。私は自分自身でさまざまな方法をベンチマークし、最も適した方法を選択します。

    関連する問題