Mysql连接查询优化
我在mysql中有两个表:Mysql连接查询优化,mysql,sql,join,query-optimization,Mysql,Sql,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
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
加入节点的
名称
而不是节点ID
(主键)看起来一点都不好
也许您应该将外键的NodeId
存储在Results
表中,而不是name
添加外键约束也是一个好主意。除其他外,这可能会导致根据您的配置自动编制索引
如果此更改很困难,至少您应该在节点的名称字段上强制执行唯一性
如果以这种方式更改表定义,请将查询更改为John的建议,并添加索引,它应该运行得更好,可读性更好。加入节点的名称而不是节点ID
(主键)看起来一点也不好
也许您应该将外键的NodeId
存储在Results
表中,而不是name
添加外键约束也是一个好主意。除其他外,这可能会导致根据您的配置自动编制索引
如果此更改很困难,至少您应该在节点的名称字段上强制执行唯一性
如果以这种方式更改表定义,请将查询更改为John的建议,并添加索引,它应该运行得更好,可读性更高/形式更好。在演示后为2个表创建表输出您是指拼写错误还是缺少更大的内容?我看不出有什么逻辑上的错误,只是tra
vsrta
@jon_darkstar:那就是。我没仔细看,我的桌子真的很大。所以,我只是删减了一些专栏,发布了较小的版本。如果你认为真正的表格有意义,我也可以发布它们。谢谢。@M99:请确认剥离测试用例的问题仍然存在。你做了一个很好,但你应该确保你做得很好。:)为2个表发布创建表输出您是指拼写错误还是缺少更大的内容?我看不出有什么逻辑上的错误,只是tra
vsrta
@jon_darkstar:那就是。我没仔细看,我的桌子真的很大。所以,我只是删减了一些专栏,发布了较小的版本。如果你认为真正的表格有意义,我也可以发布它们。谢谢。@M99:请确认剥离测试用例的问题仍然存在。你做了一个很好,但你应该确保你做得很好。:)+1将where
子句更改为联接条件并添加这些索引应该会产生很大的不同。我猜,使用全连接和where子句,一个巨大的笛卡尔乘积会在修剪之前被中间创建。有人能验证这一点吗?或者它是否得到了优化?据我所知,在WHERE-over-join之间没有任何真正的性能提升。我只是喜欢JOIN语法,因为它使意思非常清楚。这些是我的表连接和过滤器。所有性能提升都是通过添加索引实现的。您可以重试旧查询,它应该运行得同样快。+1更改where
子句以连接条件并添加这些索引应该会产生很大的不同。我猜,使用全连接和where子句,一个巨大的笛卡尔乘积会在修剪之前被中间创建。有人能验证这一点吗?或者它是否得到了优化?据我所知,在WHERE-over-join之间没有任何真正的性能提升。我只是喜欢JOIN语法,因为它使意思非常清楚。这些是我的表连接和过滤器。所有性能提升都是通过添加索引实现的。您可以重试您的旧查询,它应该以同样快的速度运行。
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