sql >> データベース >  >> RDS >> Mysql

SQLパフォーマンスUNIONとOR

    あなたが読んだ記事が悪い例を使用したか、あなたが彼らの主張を誤って解釈したかのどちらかです。

    select username from users where company = 'bbc' or company = 'itv';
    

    これは次と同等です:

    select username from users where company IN ('bbc', 'itv');
    

    MySQLはcompanyのインデックスを使用できます このクエリでは問題ありません。 UNIONを実行する必要はありません。

    よりトリッキーなケースは、ORがある場合です。 2つの異なるを含む状態 列。

    select username from users where company = 'bbc' or city = 'London';
    

    companyにインデックスがあるとします。 cityの個別のインデックス 。 MySQLは通常、特定のクエリでテーブルごとに1つのインデックスのみを使用する場合、どのインデックスを使用する必要がありますか? companyのインデックスを使用する場合 、cityがある行を見つけるには、テーブルスキャンを実行する必要があります。 ロンドンです。 cityのインデックスを使用する場合 、companyが存在する行のテーブルスキャンを実行する必要があります はbbcです。

    UNION 解決策はこのタイプの場合です。

    select username from users where company = 'bbc' 
    union
    select username from users where city = 'London';
    

    これで、各サブクエリはその検索にインデックスを使用でき、サブクエリの結果はUNIONによって結合されます。 。

    匿名のユーザーが上記の私の回答の編集を提案しましたが、モデレーターは編集を拒否しました。編集ではなく、コメントである必要がありました。提案された編集の主張は、UNIONが重複行を排除するために結果セットをソートする必要があるというものでした。これにより、クエリの実行が遅くなるため、インデックスの最適化が無駄になります。

    私の答えは、UNIONが発生する前に、インデックスが結果セットを少数の行に減らすのに役立つということです。 UNIONは実際には重複を排除しますが、それを行うには、小さな結果セットをソートするだけで済みます。 WHERE句がテーブルのかなりの部分に一致する場合があり、UNION中の並べ替えは、単にテーブルスキャンを実行するのと同じくらいコストがかかります。ただし、インデックス付き検索によって結果セットが削減されることが一般的であるため、並べ替えはテーブルスキャンよりもはるかに低コストです。

    違いは、テーブル内のデータと検索対象の用語によって異なります。特定のクエリに最適なソリューションを決定する唯一の方法は、MySQLクエリプロファイラー パフォーマンスを比較します。



    1. MySQLを使用してUnixタイムスタンプを人間が読める形式の日付に変換する

    2. Oracleの複数のREPLACE関数

    3. MAX対トップ1-どちらが良いですか?

    4. PostgreSQLCommitfestの管理