PostgreSQLマテリアライズドビューとMySQLビューの違いは何ですか?
VIEW
はストアドクエリです。そこから選択すると、基本的にクエリが実行されます。
CREATE VIEW foo
AS
SELECT col1,col2
FROM bar;
本質的に
SELECT foo.*
FROM (
SELECT col1,col2
FROM bar
) AS foo;
マテリアライズドビューは、多かれ少なかれ、ディスクにキャッシュ(またはマテリアライズ)されるビューです。
CREATE IF NOT EXISTS TABLE foo
AS
SELECT col1,col2
FROM bar;
少なくともPostgresSQLには、コマンド REFRESH MATERIALIZED VIEW
ビューの名前をフィードでき、それを最初から再生成します:REFRESH MATERIALIZED VIEW foo;
これはMySQLにのみ適用されます...
MySQLにはマテリアライズドビューがありません。
MySQLはVIEW
を、それを使用するクエリに結合します。つまり、VIEW
が定義されているときに静的に行われるのではなく、クエリごとに動的に最適化を行うことができます。 2つの主要な最適化があります:MERGE
とTEMPTABLE
。 5.7 View Algorithms を参照してください。
MERGE
は、VIEW
の定義と問題のクエリをブレンドし、、次に最適化すると考えてください。
TEMPTABLE
をMERGE
をパントするものと考え、VIEW
の結果を含む一時テーブルを(スタンドアロンのSELECT
であるかのように)作成するだけです。問題のクエリでその一時テーブルを使用します。
結論として、VIEW
は「構文糖」であり、パフォーマンスツールではありません。 mergeもtemptableも、同等のものを手動で実行するよりも優れたパフォーマンスを提供できません。
「マテリアライズドビュー」は、それらを実行するための単一の「最良の」方法がないため、おそらくMySQLには存在しません。私の サマリーテーブルに関するディスカッション では、MySQLのマテリアライズドビューを拡張するための6つの方法を挙げています。それぞれに長所と短所があります。 (注:MySQLはマテリアライズドビューの構文を提供しません。youすべての作業を行います。)
マテリアライズドビューは、クエリの結果を含むデータベースオブジェクトです。たとえば、リモートにあるデータのローカルコピーであったり、テーブルや結合結果の行や列のサブセットであったり、集計関数を使用した要約であったりします。
PostgreSQLはマテリアライズドビューと一時テーブルをサポートしていますが、MySQLは一時テーブルをサポートしていますが、マテリアライズドビューはサポートしていません。違いは、MySQLビューはクエリを使用して基になるテーブルからデータをプルするのに対し、PostgreSQLマテリアライズドビューはクエリの結果セットを含むディスク上のテーブルであることです。
RDBMモデルでは、ビューはデータベースクエリの結果を表す仮想テーブルです。クエリまたは更新が通常のビューの仮想テーブルを処理するときはいつでも、DBMSはこれらを基になる基本テーブルに対するクエリまたは更新に変換します。マテリアライズドビューのアプローチは異なります。クエリ結果は、ビューではなく具象(「マテリアライズ」)テーブルとしてキャッシュされ、元のベーステーブルから随時更新される可能性があります。これにより、追加のストレージと一部のデータが古くなる可能性があるという犠牲を払って、はるかに効率的なアクセスが可能になります。マテリアライズドビューは、実際のベーステーブルの頻繁なクエリにコストがかかる可能性のあるデータウェアハウジングのシナリオで特に役立ちます。