MySQL ビュー クエリのパフォーマンスの不一致
問題:
約 100,000 人のユーザーを含むデータベース テーブルレコードは、直接クエリとビューを使用したクエリとの間に大きなパフォーマンスの違いを示します。テーブルに直接アクセスするクエリのプラン コストは 5200 ですが、ビューにアクセスするクエリのプラン コストは 100,000 です。
説明:
パフォーマンスの不一致は次のとおりです。ビューの実行に使用されるアルゴリズムが原因です。この場合のビューは、WHERE 句で指定されたフィルタリング操作を実行する前に、基になるテーブルからすべての行を一時テーブルに取得する「temptable」アルゴリズムを使用します。対照的に、直接クエリでは「マージ」アルゴリズムが使用され、基になるテーブルのインデックス付きデータに対してフィルタリング操作が直接実行されます。
ビューの WHERE 句
ビュー内の WHERE 句は、ビューが基になるテーブルからすべての行を取得した後に適用されます。これは、ビューが特定のフィルター基準を使用して作成されている場合でも、ビューに対するクエリ内の WHERE 句が一時テーブルから取得された各行に適用されることを意味します。
解決
このパフォーマンスの問題を解決するには、「マージ」アルゴリズムを使用してビューを作成する必要があります。これは、「マテリアライズド ビュー」オプションを使用することで実現できます。マテリアライズド ビューは、ビューの事前に計算されたコピーです。これは物理テーブルに格納されるため、マテリアライズド ビューに対するクエリではフィルタリングに「マージ」アルゴリズムを使用できます。
例:
マテリアライズド ビューを作成するには「マージ」アルゴリズムを使用する場合は、次の構文を使用します。
<code class="sql">CREATE MATERIALIZED VIEW vw_users AS SELECT state, COUNT(*) AS cnt FROM users GROUP BY state;</code>
マテリアライズド ビューが作成されると、それに対するクエリのプラン コストが削減され、パフォーマンスが向上します。
以上がビュー クエリがダイレクト テーブル クエリと比較してパフォーマンスに差異があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。