簡體   English   中英

Mysql Join查詢優化

[英]Mysql Join Query optimization

我在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
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. 在節點(名稱)上創建索引

聯接節點name而不是NodeId (主鍵)看起來一點也不好。

也許您應該在Results表中存儲外鍵senderreceiver NodeId而不是name添加外鍵約束也是一個好主意。 除其他外,這可能會導致自動索引,具體取決於您的配置

如果此更改很困難,則至少應在nodename字段上實施唯一性

如果您以這種方式更改表定義,則將查詢更改為John的建議,並添加索引,它應能更好地運行並且更具可讀性/更好的形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM