[英]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
联接节点name
而不是NodeId
(主键)看起来一点也不好。
也许您应该在Results
表中存储外键sender
和receiver
NodeId
而不是name
添加外键约束也是一个好主意。 除其他外,这可能会导致自动索引,具体取决于您的配置
如果此更改很困难,则至少应在node
的name
字段上实施唯一性
如果您以这种方式更改表定义,则将查询更改为John的建议,并添加索引,它应能更好地运行并且更具可读性/更好的形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.