2011-01-30 151 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 ...`的輸出。 – 2011-01-30 10:31:46

回答

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' 

該語法的一個優點(但不是唯一的一個)是,它使從使用內部聯接到外部聯接更容易。

爲了優化,我首先運行EXPLAIN SELECT ...來檢查您在每個表上的列web上的索引,並且該索引實際上被優化器使用。如果索引丟失,那麼添加索引很可能會提高查詢的速度。

如果查詢返回很多行或列,可以通過僅返回所需的列並僅返回前幾行並實現分頁(如果要查看更多行)來提高性能。

+0

是的,我確實有每個表的不尋常的索引 – leon 2011-01-30 10:42:16

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

您可以命名您正在顯示的單元格而不是「*」。這將提高性能......