首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql连接查询优化

Mysql连接查询优化
EN

Stack Overflow用户
提问于 2011-05-06 08:45:14
回答 2查看 2.4K关注 0票数 0

我在mysql中有两个表:

代码语言:javascript
复制
Results Table : 1046928 rows.
Nodes Table :  50 rows.

我用下面的查询连接这两个表,查询的执行非常非常慢。

代码语言:javascript
复制
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分钟。谢谢。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-06 08:57:46

代码语言:javascript
复制
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. 为节点创建索引(名称)
票数 4
EN

Stack Overflow用户

发布于 2011-05-06 09:05:46

在节点的name而不是NodeId (主键)上连接看起来一点都不好。

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

如果此更改很困难,至少应该在nodename字段上强制使用唯一性

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5905686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档