1. ホーム
  2. sql

[解決済み] SQLのWHERE句におけるINとORの比較

2022-04-21 06:56:40

質問

大きなデータベースを扱う場合、どちらの方がパフォーマンスが高いですか? IN または OR をSQLで指定します。 Where -の節は?

実行方法について何か違いがあるのでしょうか?

どのように解決するのですか?

以下のような性能差を知りたいということですね。

WHERE foo IN ('a', 'b', 'c')
WHERE foo = 'a' OR foo = 'b' OR foo = 'c'

によると のマニュアルは、MySQL 値が一定であれば IN はリストをソートし、バイナリサーチを使用します。私が想像するのは OR は、順不同で1つずつ評価します。つまり IN の方が速い場合があります。

どちらの方が速いかは、あなたのデータベースで、あなたの特定のデータを使って、両方をプロファイルするのが一番です。

1000000行のMySQLで両方を試してみました。カラムにインデックスを付けた場合、パフォーマンスに明らかな違いはなく、どちらもほぼ瞬時に実行されます。カラムにインデックスがない場合は、以下のような結果になりました。

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)

つまりこの場合、ORを使った方法の方が30%程度遅くなるわけです。さらに項を追加すると、その差は大きくなります。他のデータベースや他のデータでは結果が異なる場合があります。