ホームページ  >  記事  >  データベース  >  MySQL ビューはインデックスを活用して効率的なクエリを実行できますか?

MySQL ビューはインデックスを活用して効率的なクエリを実行できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-10 00:47:02744ブラウズ

Can MySQL Views Leverage Indexes for Efficient Queries?

MySQL ビューはクエリにインデックスを利用できますか?

MySQL がビューのクエリにインデックスを利用するのは簡単ではありません。基礎となるテーブルにインデックスがあるにもかかわらず、ビュー クエリは個別に処理され、非効率につながる可能性があります。

解決策: カバー インデックス

最適な解決策は、「カバー インデックス」を作成することです。 " 基になるテーブルにあります。このインデックスには、ビューの定義クエリで参照される列と、グループ化に使用される列が含まれている必要があります。カバリング インデックスを使用すると、MySQL はインデックスから直接ビュー クエリを満たすことができ、基礎となるテーブル ページにアクセスする必要がなくなります。

たとえば、ハイスコア テーブルで提供された例を考慮すると、カバリング インデックスは次のようになります。

CREATE INDEX highscores_IX3
ON highscores (player, happened_in, score);

このインデックスを適切に配置すると、MySQL はそれをビューに利用できます。 query:

SELECT * FROM v_kobe_highscores WHERE happened_in = 2006;

MySQL のビューに問題がある理由

他のデータベースとは異なり、MySQL は外部クエリからの述語をビュー クエリに「プッシュ」しません。代わりに、ビュー クエリが個別に実行され、ビュー定義のすべての行を含む中間テーブルが具体化されます。次に、外部クエリがこの派生テーブルに適用されます。

このプロセスは、特に大きなテーブルにわたって定義されたビューの場合、パフォーマンスの低下につながる可能性があります。

代替: インデックス付きスタンドアロン クエリ

場合によっては、ビューを使用する代わりにスタンドアロン クエリを実行する方が効率的である場合があります。例:

SELECT player
     , MAX(score) AS highest_score
     , happened_in
 FROM highscores
WHERE player = 24
  AND happened_in = 2006
GROUP
   BY player
    , happened_in;

ハイスコア テーブルに適切なカバー インデックスを使用すると、このクエリはビューの作成と実体化のオーバーヘッドを発生させずに、目的のデータを効率的に取得できます。

以上がMySQL ビューはインデックスを活用して効率的なクエリを実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。