2016-08-02 1 views
0

私は基本的に私のデータベースの複数のテーブルからさまざまな列の異なる組み合わせのマスターテーブルを与える非常に複雑なクエリを持っています$ query(PHPを使用)、$ result = mysql_queryの結果です。私は本当に複雑なクエリを再度実行することなく、その後の小さなクエリでその$結果を再利用できるようにしたいと思います。

$ DISPLAYのようなものは、$ resultとxxx、xxxの間にあります。私は実際に$ resultの文字列を入れても問題はありませんが、複雑なクエリをずっと実行する必要がなければ効率が良いようです。それは可能ですか?どちらか

+0

あなたが保存した変数を変更しないでください。最初にコードを書こうとすると、コードとエラーが何か問題を起こした場合、より建設的なフィードバックを提供することができます。 –

+2

mysql_query()を実際に使用している場合は、mysqli_関数または 'PDO'への移行を検討する必要があります。 'mysql_'関数はかなり前に廃止され、PHP 7で削除されました。 – Chris

答えて

1

あなたがすることができます

  1. 一時テーブルにあなたの結果を保存します。

    CREATE TEMPORARY TABLE myTempTable SELECT ... 
    

    は、次にそれを使用:

    SELECT DISTINCT column FROM myTempTable WHERE xxx AND xxx AND xxx 
    

または

  • 使用

      view

      CREATE VIEW myView SELECT ... 
      

      は、その使用:

      SELECT DISTINCT column FROM myView WHERE xxx AND xxx AND xxx 
      

    差は、ビューは、すべてのセッション間表示され、ということです手動で落とされるまで持続する。一時テーブルはセッションを作成したセッション内でのみ表示されます(セッションが終了すると存在しなくなります)。

    また、元のテーブルの更新時に、ビューを照会するときにそのような変更がすぐに反映されます(通常のトランザクション分離動作を除く)。対照的に、一時テーブル(通常のテーブルのように)は、データの静的コピーを保持します。この静的コピーは、後続のクエリによって明示的に更新された場合にのみ変更されます。

    したがって、パフォーマンスの違いがあります。ビューは、基礎となる表の索引を使用できますが、一時表は独自に定義する必要があります。しかし、テンポラリテーブルはキャッシュされたデータを使用するため、毎回(ビューとは異なり)基礎となるクエリを再実行する必要はありません。

  • +1

    ありがとうございました。私は実際にmysqli_query、おかげで、typoを使用しています。 これはまさに私が知る必要があったことです。クエリが複雑な場合は、ビューと一時テーブルの間に大きなパフォーマンスヒットが存在することは想像できますが、ビューは動的に更新され永続的になるという利点があります。私の場合、基本的には、セッション中に追加のクエリを実行する必要があります。このクエリは大量になる可能性があります。その結果、セッションを破棄したり破棄したりすることができます。 – sscotti

    +0

    @sscotti:テンポラリテーブルでは、最初の作成/人口を減速させる索引を定義できますが、後続の検索は高速化されます。あなたはそれを見ることができません。だから、あなたにとって最もパフォーマンスの高いものは、あなたの正確なスキーマ、データ、クエリに非常に依存しています。 – eggyal

    +0

    ビューの使用に関する質問。あなたがMySQLエンジンで作成したもので、テーブルを作成するようなものです。だからあなたはPHPの中でそれをプログラムで作成しないのですか?それは他のテーブルの変更のための "リスナー"の並べ替えを持っているし、自動的に自動的に更新する場合、素晴らしいの種類。他のテーブルがセッション中に非常に頻繁に更新されない場合でも、この素晴らしい作業ができます。この場合、Viewはほぼ静的になりますか? – sscotti

    関連する問題