MySQL は、インデックスを使用してデータの取得を高速化し、データベースのパフォーマンスを向上させる強力なリレーショナル データベース管理システムです。ただし、場合によっては、MySQL の in query ステートメントでインデックスが使用されない場合があり、これによりパフォーマンスが大幅に低下します。
この記事では、MySQL のクエリ ステートメントでインデックスが使用されない理由について説明し、クエリ ステートメントを最適化し、適切なインデックスを確立することでパフォーマンスを向上させる方法を紹介します。
MySQL では、in クエリ ステートメントは、指定された値リストにターゲット値が存在するかどうかを判断するために使用されます。例:
SELECT * FROM table WHERE id IN (1, 2, 3);
このクエリ ステートメントは、テーブル内の ID 1、2、または 3 を持つすべての行を返します。
クエリの実行中、MySQL はリスト内の各値に対応するクエリを実行し、結果を結合します。リストに多数の値が含まれている場合、このプロセスには非常に時間がかかり、クエリのパフォーマンスに影響を与える可能性があります。
クエリ効率を向上させるために、MySQL は通常インデックスを使用してクエリを高速化します。インデックスは、MySQL が必要なデータ行を迅速に見つけるのに役立つ特別なデータ構造です。 MySQL が in クエリを実行するとき、インデックスがクエリのすべての列をカバーしている場合、MySQL はこのインデックスを使用してクエリを高速化できます。これにより、クエリのコストを大幅に削減できます。
ただし、MySQL が in query ステートメントを使用する場合、常に既存のインデックスを使用できるとは限りません。 。 MySQL がインデックスを使用しない理由には通常、次のようなものがあります。
2.1 値のリストが長すぎる
MySQL は、クエリの実行時にリスト内の各値をインデックスと比較して判断します。この値がインデックスにあるかどうか。したがって、値のリストが長すぎる場合、MySQL はインデックスを使用せず、代わりにテーブル全体のスキャンを使用してクエリを実行します。これにより、特にテーブル内のデータ量が非常に多い場合、クエリのパフォーマンスが大幅に低下する可能性があります。
2.2 値リストがインデックス データ型と一致しない
もう 1 つの理由は、値リストのデータ型がインデックス フィールドのデータ型と一致しない場合、MySQL がインデックスを使用できないことです。 。たとえば、インデックス付きフィールドの型が int であるが、値のリストに文字列型または日付型の値が含まれている場合、MySQL はクエリを実行するためにインデックスを使用できません。
2.3 値リストに NULL 値があります
値リストに NULL 値が含まれている場合、MySQL はインデックスを使用してクエリを実行できません。その理由は、インデックスに NULL 値を含めることができないため、MySQL はテーブル全体のスキャンを実行して NULL 値を含む行を見つける必要があるためです。
2.4 値リストがインデックスのプレフィックス位置にありません
MySQL は、インデックスのプレフィックス位置にある値リストの値とのみ一致します。値リストの値がインデックスのプレフィックス位置にない場合、MySQL はクエリを高速化するためにインデックスを使用できません。
クエリでインデックスが使用されない状況を回避するには、クエリ パフォーマンスを向上させるためにいくつかの最適化措置を講じる必要があります。 。以下に最適化の提案をいくつか示します。
3.1 値リストの長さを制限する
in query ステートメントを使用する必要がある場合は、MySQL が確実に実行できるように値リストの長さを制限できます。インデックスを使用してクエリを実行できます。具体的には、値のリストを複数の小さな値のリストに分割し、UNION ALL 操作を使用して結果を結合してみることができます。これにより、MySQL は値の小さなリストごとにインデックスを使用できるようになります。
3.2 IN の代わりに EXISTS を使用する
EXISTS は IN クエリの代替手段であり、クエリのパフォーマンスを大幅に向上させることができます。具体的には、in クエリは、次のようなexists クエリに変換できます。
SELECT * FROM table WHERE EXISTS (SELECT 1 FROM table2 WHERE table.id = table2.id);
このクエリは、2 つのテーブル間に一致する行があるかどうかを確認します。 MySQL がインデックスを使用してこれらの行を取得できれば、クエリの実行時間が大幅に短縮されます。
3.3 値リストのデータ型がインデックス フィールドのデータ型と一致することを確認する
もう 1 つの最適化提案は、値リストのデータ型がインデックス フィールドのデータ型と一致することを確認することです。インデックスフィールド。不一致がある場合は、CAST 関数や CONVERT 関数などの型変換関数を使用して、強制的に一致させることができます。
3.4 値リストに NULL 値を含めないでください
MySQL がインデックスを使用できないことを避けるために、値リストに NULL 値を含めないでください。 NULL 値を含む行をクエリする必要がある場合は、IS NULL または IS NOT NULL 演算子を使用します。
3.5 値リスト内の値がインデックスのプレフィックス位置にあることを確認します。
最後に、値リスト内の値をプレフィックス位置に移動してみてください。 MySQL がそのインデックスを使用してクエリを実行できるようにするためのインデックスの変更。 ORDER BY 句と LIMIT 句を使用して結果セットの順序と長さを制御すると、MySQL がインデックスを使用してクエリを実行できるようになります。
in query ステートメントの動作と使用方法により、MySQL はインデックスを使用してクエリを高速化できるとは限りません。この問題を回避するには、上記の最適化の提案を使用してクエリのパフォーマンスを向上させます。
一般に、MySQL クエリ ステートメントのパフォーマンスを最適化するには、MySQL の内部メカニズムと最適化手法を理解する必要があります。インデックスとクエリ ステートメントを最適化することで、MySQL のパフォーマンスとスケーラビリティが大幅に向上し、大量のデータをより効率的に処理できるようになります。
以上がMySQL ではインデックスを使用しませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。