0

だから私は友達のウェブサイトを持っていて、彼がホストからメールを受け取ったので、彼のウェブサイトはeatingリソースが多すぎるので、彼がクエリを最適化するのを手伝おうとしています。だから私が考えていたこのクエリを見て、これがより速くまたはよりスマートになる方法はありますか(より少ない時間またはより少ないメモリを消費する)、プリペアドステートメントまたは現在のコードの改善のどちらが最善のアプローチであるかわかりません。

$query=@mysql_query("
    SELECT 
        tl.title, 
        tl.dt, 
        tk.nr as nr2, 
        tk.name as cat, 
        tf.name, 
        tf.type, 
        tf.alt,
        tt.trupi
    FROM 
        ".$tab['news']." as tl, 
        ".$tab['category']." as tk, 
        ".$tab['foto']." as tf, 
        ".$tab['entry']." as th, 
        ".$tab['body']." as tt
    WHERE 
        tl.nr = '$nr' AND 
        tl.foto = tf.nr AND 
        tl.kategoria = tk.nr AND 
        tl.hyrja = th.nr AND 
        tl.trupi = tt.nr");

私はあなたの提案のすべてに感謝します、ありがとう。

4

3 に答える 3

2

まず、ANSI92結合構文を使用できます。

2文字の頭字語を取り除くことと組み合わせると、クエリが何をしているかを明確にするという利点があります。

于 2012-09-11T10:30:38.670 に答える
1

多分試して...

$nr = mysql_real_escape_string( $nr );

$tab['category'] = mysql_real_escape_string( $tab['category'] );
$tab['foto']     = mysql_real_escape_string( $tab['foto'] );
$tab['entry']    = mysql_real_escape_string( $tab['entry'] );
$tab['body']     = mysql_real_escape_string( $tab['body'] );

$query = @mysql_query("
    SELECT 
        tl.title, 
        tl.dt, 
        tk.nr as nr2, 
        tk.name as cat, 
        tf.name, 
        tf.type, 
        tf.alt,
        tt.trupi
    FROM 
        ".$tab['news']." as tl
        LEFT JOIN ".$tab['category']." as tk ON ( tk.nr = tl.kategoria )
        LEFT JOIN ".$tab['foto']." as tf ON ( tf.nr = tl.foto )
        LEFT JOIN ".$tab['entry']." as th ON ( th.nr = tl.hyrja )
        LEFT JOIN ".$tab['body']." as tt ON ( tt.nr = tl.trupi )
    WHERE 
        tl.nr = '$nr'");

変数を SQL 文字列で使用する前にエスケープすることに注意してください ( Bobby Tablesを参照してください)。

留意すべきもう 1 つの点は、データベース全体の設計です。テーブル間に「1 対 1」の関係のインスタンスがある場合は、それらの 2 つのテーブルを 1 つのテーブルに折りたたむ必要があります。

于 2012-09-11T10:57:01.703 に答える
0

すべてのテーブルに対して as を使用する必要はありません。またExplain、クエリがどの程度最適であるかを確認するためにも使用します。ここで優れたガイドを見つけることができますhttp://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing- Explain の結果を解釈する方法については、MySQL-Queries-and-Indexes.htmを参照してください。

クエリに追加されたすべてのアクションは、何らかの形でパフォーマンスを低下させますが、ボトルネックは結合自体と、テーブルを関連付ける方法だと思います。あるテーブルを別のテーブルに関連付けるときは整数 (id) を使用してみてください。それが不可能な場合は、関連付ける列にインデックスが付けられていることを確認してください。それはあなたのクエリを著しく増加させるでしょう。

于 2012-09-11T10:28:30.023 に答える