。
CREATE VIEW vMyLongQuery
AS
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
このように参照することができる:例えば
SELECT a, b, c FROM vMyLongQuery
は構文の詳細はhttp://dev.mysql.com/doc/refman/5.0/en/create-view.htmlを参照してください。
パフォーマンスに関しては、最高のパフォーマンスは、あなたが今やっていることとまったく同じで、最悪の場合、あなたのアプリを殺すでしょう。これは、ビューで何をするか、MySQLがそれらを処理する方法によって異なります。
MySQLはビューを2つの方法で実装しますmerge
とtemptable
。 merge
オプションは、あなたが現在やっていることとほぼ同じです。ビューはサブクエリとしてクエリにマージされます。魅力的であれば、実際にはすべてのデータを魅力的なものにスプールし、次にその誘惑的なものにselect/join
を入れます。あなたはまた、データが誘惑に加わるときにインデックスの利益を失います。
クエリプランでは、merge
のクエリプランでは、次のいずれのビューもサポートされていません。
- 集計関数(SUM()、MIN()、MAX()、等COUNT()など)
- LIMIT
- UNIONをHAVING
- BY
- DISTINCT GROUPまたはUNION ALL
- 選択リストのサブクエリ
- 下位テーブルのないリテラルへの参照
サブクエリでこれらを使用すると、パフォーマンスが低下する可能性があります。
また、OMG Poniesの助言に注意してください。ビューは基本クラスと同じではありません。ビューはDB内に配置されていますが、簡単に誤用される可能性があります。エンジニアがOOバックグラウンドからデータベースにアクセスすると、ビューは継承とコードの再利用を促進する便利な方法のように思えます。多くの場合、ネストされたビューのネストされたビューに結合されたネストされたビューを持つポジションに人々はしばしば行きます。 SQLはネストされたビューを処理します。基本的には個々のビューの定義を取り、DBAを泣かせるクエリのビーストにそのビューを拡張します。
また、あなたの例では優れた実践に従っており、これを続行することをお勧めします。すべての列を個別に指定し、SELECT *を使用してビューの結果を指定することは決してありませんでした。それは、結局、あなたの日を台無しにするでしょう。
あらゆることにはある程度のオーバーヘッドがあります。 IMEでは、SQLはJava/.NET /などのようなコードの再利用には適していません。 SQLはクエリ全体をキャッシュします。大文字と小文字の区別は含まれません。 –
私はmySQLもサブクエリをキャッシュしていると聞いてきました。しかし、私はこれがどれほど真実かはわかりません。 –
一般的にMySQLやSQL(Oracle、SQL Server、多分PostgreSQLも)はクエリの一部をキャッシュしません。 –