我在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发布于 2011-05-06 08:57:46
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发布于 2011-05-06 09:05:46
在节点的name而不是NodeId (主键)上连接看起来一点都不好。
也许您应该将外键的NodeId、sender和receiver存储在Results表中,而不是name中,添加外键约束也是一个好主意。此外,这可能会导致根据您的配置自动建立索引
如果此更改很困难,至少应该在node的name字段上强制使用唯一性
如果您以这种方式更改表的定义,将您的查询更改为John的建议,并添加索引,那么它应该运行得更好,可读性也更好。
https://stackoverflow.com/questions/5905686
复制相似问题