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 サイトの他の関連記事を参照してください。