2011-11-09 9 views
3

を作成し、私は複数のこのようなクエリを持っています。クエリ(また、エラーやコードの重複を減らす) MySQLは基本的にSQLサブクエリの別名

  • おそらくパフォーマンスを最適化を簡素化短縮&

    1. :私はこのサブクエリになり、主にエイリアスを与えることを探しています。今まで

    (私はこれは、MySQLのクエリキャッシュにより、デフォルトで実行されると信じて)、私はそれを保存するには、この方法をやっている:

    variable = LONG QUERY; 
    Query("SELECT a, b, c FROM ("+variable+") X WHERE ..."); 
    

    悪くされていません。私はこれを内部的にmysqlで行う方法を探しています。

    オーバーヘッドを発生させないシンプルな読み取り専用ビューを作成することができますので、どこでも行えますか?私はこれがより徹底的な方法であると信じています&可読な方法です。

    SELECT a, b, c FROM myTable WHERE ... 
    
  • +1

    あらゆることにはある程度のオーバーヘッドがあります。 IMEでは、SQLはJava/.NET /などのようなコードの再利用には適していません。 SQLはクエリ全体をキャッシュします。大文字と小文字の区別は含まれません。 –

    +0

    私はmySQLもサブクエリをキャッシュしていると聞いてきました。しかし、私はこれがどれほど真実かはわかりません。 –

    +1

    一般的にMySQLやSQL(Oracle、SQL Server、多分PostgreSQLも)はクエリの一部をキャッシュしません。 –

    答えて

    5

    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つの方法で実装しますmergetemptablemergeオプションは、あなたが現在やっていることとほぼ同じです。ビューはサブクエリとしてクエリにマージされます。魅力的であれば、実際にはすべてのデータを魅力的なものにスプールし、次にその誘惑的なものにselect/joinを入れます。あなたはまた、データが誘惑に加わるときにインデックスの利益を失います。

    クエリプランでは、mergeのクエリプランでは、次のいずれのビューもサポートされていません。

    • 集計関数(SUM()、MIN()、MAX()、等COUNT()など)
    • LIMIT
    • UNIONをHAVING
    • BY
    • DISTINCT GROUPまたはUNION ALL
    • 選択リストのサブクエリ
    • 下位テーブルのないリテラルへの参照

    サブクエリでこれらを使用すると、パフォーマンスが低下する可能性があります。

    また、OMG Poniesの助言に注意してください。ビューは基本クラスと同じではありません。ビューはDB内に配置されていますが、簡単に誤用される可能性があります。エンジニアがOOバックグラウンドからデータベースにアクセスすると、ビューは継承とコードの再利用を促進する便利な方法のように思えます。多くの場合、ネストされたビューのネストされたビューに結合されたネストされたビューを持つポジションに人々はしばしば行きます。 SQLはネストされたビューを処理します。基本的には個々のビューの定義を取り、DBAを泣かせるクエリのビーストにそのビューを拡張します。

    また、あなたの例では優れた実践に従っており、これを続行することをお勧めします。すべての列を個別に指定し、SELECT *を使用してビューの結果を指定することは決してありませんでした。それは、結局、あなたの日を台無しにするでしょう。

    +0

    あなたの答えは神です。明確化のためにありがとう!しかし、私は問題がある、SQLは私にエラーを与える: 'ViewのSELECTはFROM句のサブクエリを含んでいる'。私はこの方法でクエリを書き直すことはできないのではないかと心配しています。 –

    +1

    ビューをサブクエリとして記述してみます。クエリ全体をカプセル化しないでください。コードを投稿することを検討してください。 –

    +0

    これは本当に基本的なものです: 'CREATE VIEW updatesLast AS SELECT artistSiteID、timeID、number、rank FROM updates NATURAL JOIN(artistSiteID、MAX(timeID)をtimeID FROM更新GROUP BY artistSiteIDとして)Y' –

    0

    これはあなたが探しているものかどうかわかりませんが、ストアドプロシージャを使用してmysqlクエリを呼び出すことができます。あなたは別のクエリの中でそれを使用することができますかどうかわからない?通常、これらのビューと呼ばれている

    http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx