[解決済み] 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%程度遅くなるわけです。さらに項を追加すると、その差は大きくなります。他のデータベースや他のデータでは結果が異なる場合があります。
関連
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】Oracleクエリが順序付け後に返す行数を制限するにはどうすればいいですか?
-
[解決済み】SQL Serverでdatetimeの時間部分を削除する最良の方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み】MYSQLのORとINの性能比較