2011-05-06 191 views
0

我在mysql中的兩個表:Mysql的連接查詢優化

Results Table : 1046928 rows. 
Nodes Table : 50 rows. 

我用下面的查詢和查詢的執行連接這兩個表是非常非常慢。

select res.TIndex, res.PNumber, res.Sender, res.Receiver, 
sta.Nickname, rta.Nickname from ((Results res join 
Nodes sta) join Nodes rta) where ((res.sender_h=sta.name) and 
(res.receiver_h=rta.name)); 

請幫我優化此查詢。現在,如果我想拉動前5排,大約需要5-6分鐘。謝謝。

CREATE TABLE `nodes1` (
    `NodeID` int(11) NOT NULL, 
    `Name` varchar(254) NOT NULL, 
    `Nickname` varchar(254) NOT NULL, 
    PRIMARY KEY (`NodeID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `Results1` (
    `TIndex` int(11) NOT NULL, 
    `PNumber` int(11) NOT NULL, 
    `Sender` varchar(254) NOT NULL, 
    `Receiver` varchar(254) NOT NULL, 
    `PTime` datetime NOT NULL, 
    PRIMARY KEY (`TIndex`,`PNumber`), 
    KEY `PERIOD_TIME_IDX` (`PTime`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
+0

發佈2個表的SHOW CREATE TABLE輸出 – 2011-05-06 00:47:22

+0

該查詢甚至不是有效的。 – 2011-05-06 00:51:42

+0

你只是指拼寫錯誤還是有更大的想法?我沒有看到任何邏輯錯誤的東西,只是'tra' vs'rta' – 2011-05-06 00:54:29

回答

4
SELECT res.TIndex , 
     res.PNumber , 
     res.Sender , 
     res.Receiver , 
     sta.Nickname , 
     rta.Nickname 
FROM Results AS res 
     INNER JOIN Nodes AS sta ON res.sender_h = sta.name 
     INNER JOIN Nodes AS rta ON res.receiver_h = rta.NAME 
  1. 上創建結果的索引 (sender_h)
  2. 上創建結果的索引(receiver_h)
  3. 上創建節點(名)的索引
+0

+1改變where where條款加入條件並添加這些索引應該有很大的不同。即時通訊猜測,與完整的聯接和where子句一個巨大的笛卡爾產品在修剪之前被中間創建。任何人都可以驗證這個或它是否得到優化? – 2011-05-06 01:08:33

+0

據我所知,在JOIN之間沒有任何真正的性能增益。我只是更喜歡JOIN語法,因爲它使含義非常清晰。例如,這些是我的表格連接,這些是我的過濾器。所有的性能提升都是通過添加索引來實現的。您可以重試您的舊查詢,並且它應該同樣快速地運行。 – 2011-05-06 01:17:54

1

加入節點的name而不是NodeId(主鍵)看起來不太好。

也許你應該爲外鍵senderreceiverResults表,而不是name添加外鍵約束被存儲NodeId過一個好主意。別的不說,這可能導致索引會自動根據你的配置

如果這個改變是困難的,你應該強制唯一性上nodename

如果以這種方式來改變表定義的最起碼,改變你的查詢約翰的建議,並添加索引,它應該運行得更好,並有更多的可讀性/更好的形式。