Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql连接查询优化_Mysql_Sql_Join_Query Optimization - Fatal编程技术网

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

我在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
  • 创建结果索引 (发送者)
  • 为结果创建索引(接收者)
  • 创建索引 在节点上(名称)
  • 创建结果索引 (发送者)
  • 为结果创建索引(接收者)
  • 创建索引 在节点上(名称)

  • 加入节点的
    名称
    而不是
    节点ID
    (主键)看起来一点都不好

    也许您应该将外键的
    NodeId
    存储在
    Results
    表中,而不是
    name
    添加外键约束也是一个好主意。除其他外,这可能会导致根据您的配置自动编制索引

    如果此更改很困难,至少您应该在
    节点的
    名称
    字段上强制执行唯一性


    如果以这种方式更改表定义,请将查询更改为John的建议,并添加索引,它应该运行得更好,可读性更好。

    加入节点的
    名称而不是
    节点ID
    (主键)看起来一点也不好

    也许您应该将外键的
    NodeId
    存储在
    Results
    表中,而不是
    name
    添加外键约束也是一个好主意。除其他外,这可能会导致根据您的配置自动编制索引

    如果此更改很困难,至少您应该在
    节点的
    名称
    字段上强制执行唯一性


    如果以这种方式更改表定义,请将查询更改为John的建议,并添加索引,它应该运行得更好,可读性更高/形式更好。

    在演示后为2个表创建表输出您是指拼写错误还是缺少更大的内容?我看不出有什么逻辑上的错误,只是
    tra
    vs
    rta
    @jon_darkstar:那就是。我没仔细看,我的桌子真的很大。所以,我只是删减了一些专栏,发布了较小的版本。如果你认为真正的表格有意义,我也可以发布它们。谢谢。@M99:请确认剥离测试用例的问题仍然存在。你做了一个很好,但你应该确保你做得很好。:)为2个表发布创建表输出您是指拼写错误还是缺少更大的内容?我看不出有什么逻辑上的错误,只是
    tra
    vs
    rta
    @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