2011-01-30 6 views
0
SELECT * 
FROM tfdata,linkdata,gndata,serdata 
WHERE tfdata.web = linkdata.web 
    AND tfdata.web = gndata.web 
    AND tfdata.web = serdata.web 
    AND tfdata.web = '"mysql_real_escape_string($uri)"'" 

私はこの方法が遅く、知りたいと思っていますか?LEFT JOINはこれに取り組んでいますか?はいの場合はどうすれば同じものを追加できますか?または周囲に何か別の場所がありますか?このクエリを最適化するにはどうすればよいですか?

+0

各テーブルと 'EXPLAIN SELECT ... 'の出力に' SHOW CREATE TABLE ... 'の出力を投稿してください。 –

答えて

1

ジョインを使用してクエリを書き換えることができます。それはより読みやすくなりますが、より速くなりません。

SELECT * 
FROM tfdata 
JOIN linkdata ON tfdata.web = linkdata.web 
JOIN gndata ON tfdata.web = gndata.web 
JOIN serdata ON tfdata.web = serdata.web 
WHERE tfdata.web = 'some_uri' 

この構文の利点の1つは、内部結合の使用から外部結合への変更が容易になることです。

最適化するには、最初にEXPLAIN SELECT ...を実行して、各テーブルのweb列にインデックスがあり、このインデックスが実際にオプティマイザによって使用されていることを確認してください。索引がない場合は、索引を追加すると、問合せの速度が向上する可能性があります。

多くの行または列が返されるクエリでは、必要な列を返すだけで、最初の数行を返し、さらにいくつかの行を表示する場合はページングを実装するだけで、パフォーマンスを向上できます。

+0

はい各テーブルの索引が一意ではありません – leon

+0

上記にはmysql_fetch_assocまたはmysql_fetch_arrayを使用する必要がありますか? – leon

+0

@leon:どのクエリを使用しても、全体的にクエリのパフォーマンスに大きな違いはありません。 * mysql_fetch_assoc()は、mysql_fetch_array()にも同じことが当てはまりますが、mysql_fetch_assoc()はmysql_fetch_row()を使うよりも大幅に遅くはありません。 –

0
SELECT * FROM 
    (SELECT * FROM tfdata WHERE tfdata.web='"mysql_real_escape_string($uri)"'") As Result1,linkdata,gndata,serdata 
    WHERE Result1.web = linkdata.web AND Result1.web = gndata.web AND Result1.web = serdata.web 

インライン・セレクトを使用して、より少ない項目で結果表を取得し、すべて一緒に結合します。

1

「*」の代わりに、あなたが目にする細胞に名前を付けることができます。それはパフォーマンスを向上させるでしょう...

関連する問題