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

OR演算子を使用する場合の正しい索引付け

    インデックスがどのように機能するかを誤解しています。

    電話帳を考えてみてください(名前が最初で、名前が最後の2列のインデックスに相当します)。電話帳で「スミス」という名前の人をすべて見つけるように頼むと、名前がそのように並べられているという事実から恩恵を受けることができます。あなたはスミスが一緒に組織されていると仮定することができます。しかし、私があなたにファーストネームが「ジョン」であるすべての人々を見つけるように頼むならば、あなたはインデックスから利益を得ません。ジョンズはどのような名前でもかまいません。そのため、ジョンズは本全体に散らばっていて、表紙から表紙まで、難しい方法で検索する必要があります。

    ここで、姓が「Smith」または名が「John」のすべての人を検索するように依頼すると、以前と同じようにスミスを簡単に見つけることができますが、ジョンを見つけるのにまったく役立ちません。それらはまだ本全体に散らばっていて、あなたはそれらを難しい方法で探さなければなりません。

    SQLの複数列インデックスでも同じです。インデックスは、最初の列で並べ替えられ、最初の列が同点の場合は2番目の列で並べ替えられ、最初の2列の両方が同点の場合は3番目の列で並べ替えられます。すべての列で並べ替えられるわけではありません。同時に。したがって、複数列のインデックスは、インデックスの左端の列を除いて、検索用語をより効率的にするのに役立ちません。

    元の質問に戻ります。

    各列に個別の単一列インデックスを作成します。 MySQLの I/O操作の数の見積もり インデックスを使用すると、インデックスが発生します。

    MySQLの最新バージョンには、インデックスのマージについてもいくつかの利点があります。 、したがって、クエリは 特定のテーブルで複数のインデックスを使用してから、結果をマージしてみてください。そうしないと、MySQLは特定のクエリでテーブルごとに1つのインデックスを使用するように制限される傾向があります。

    多くの人がうまく使用するもう1つのトリックは、インデックス付きの列(それぞれのインデックスを使用する必要があります)ごとに個別のクエリを実行してから、UNION 結果。

    SELECT fields FROM table WHERE field1='something' 
    UNION
    SELECT fields FROM table WHERE field2='something' 
    UNION
    SELECT fields FROM table WHERE field3='something' 
    UNION
    SELECT fields FROM table WHERE field4='something' 
    

    最後の観察:同じ'something'を検索していることに気付いた場合 4つのフィールド間で、4つのフィールドすべてが実際に同じものであるかどうかを再検討する必要があります。また、グループが繰り返される第一正規形に違反します 。その場合、おそらくfield1からfield4は子テーブルの単一の列に属します。そうすれば、インデックス作成とクエリがはるかに簡単になります:

    SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
    WHERE child_table.field = 'something'
    


    1. SQLの設計とクエリを試すためのオンラインツール

    2. MySQL Binlogサーバーの探索–リップル

    3. 確率に基づいてランダムな値を選択する

    4. 別のテーブルに存在しないレコードを1つのテーブルから検索します