4

これは、私が決定的な答えを得たことのない質問です。この例では MySQL を使用しています。

かなり大きな値のセットが与えられた場合 (500 としましょう)。IN() 句でこれらの値を使用してテーブルを検索する方が速いですか?

SELECT * FROM table WHERE field IN(values)

または、メモリ内に一時テーブルを作成し、それに値を入力して、検索対象のテーブルに結合します。

CREATE TEMPORARY TABLE `temp_table` (`field` varchar(255) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO temp_table VALUES (values)

SELECT * FROM table t1 JOIN temp_table t2 ON t1.field = t2.field

どちらの方法でも同じ結果セットが生成されます。

独自の基本的なベンチマーク テストをいくつか行ったところ、500 を超える値を処理する場合、IN() 句よりも一時テーブルを使用する方が速くなることがわかりました。

誰かが MySQL の内部の仕組みと、この質問に対する適切な答えを説明できますか?

ありがとう、レオ

4

2 に答える 2

2

MySql オンライン ドキュメント、IN()から:

IN (値,...)

すべての値が定数の場合、それらは expr の型に従って評価され、ソートされます。アイテムの検索は、バイナリ検索を使用して行われます。これは、IN 値リストが完全に定数で構成されている場合、IN が非常に高速であることを意味します。それ以外の場合、型変換はセクション11.2「式の評価における型変換」で説明されている規則に従って行われますが、すべての引数に適用されます。

一連の定数で IN() を使用するのが理にかなっていると私が信じていることを考えると、そうでない場合は、別のテーブルでサブクエリを使用する必要があります。

アイテムが他のテーブルから取得される場合は、JOIN の代わりにEXISTS()を使用することを検討できます。大きなデータ セットの場合は大幅に高速になります。

SELECT * 
FROM table t1 
WHERE EXISTS 
      (
        SELECT * 
        FROM temp_table t2 
        WHERE t1.field = t2.field
      )
于 2011-11-02T11:26:02.267 に答える
1

正解は多くのことに依存します。

作業はすでに完了しています。ベンチマークで、一時テーブルを使用した方が高速であることがわかっている場合は、その方法を使用してください。

ハードウェアを変更したり、スキーマを大幅に変更した場合は、忘れずに再度ベンチマークを行ってください。

于 2011-11-02T11:30:28.183 に答える