2011-05-06 4 views
0

가입 나는 MySQL은 두 개의 테이블이있다.MySQL의 쿼리 최적화

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 
+0

2 테이블에 대한 SHOW CREATE TABLE 출력 게시 –

+0

쿼리가 유효하지 않습니다. –

+0

철자가 틀렸거나 더 큰 메신저가 있습니까? 나는 논리적으로 잘못된 것을 본적이 없다.'tra' vs'rta' –

답변

4
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. 는 노드 (이름)에 대한 인덱스 만들기
  2. 이 결과에 인덱스를 생성 (sender_h) 결과에 대한 인덱스 (receiver_h)
+0

+1 조건을 결합하기 위해'where' 절을 변경하고 그 색인을 추가하는 것은 큰 차이를 만들어야합니다. 나는 조인 직전에 거대한 데카르트 제품이 만들어지는 전체 조인과 where 절로 추측합니다. 누구든지이를 확인하거나 최적화 할 수 있습니까? –

+0

내가 말할 수있는 한, JOINS보다 실제 성능이 향상되지 않습니다. 나는 JOIN 구문을 선호하기 때문에 의미가 매우 명확합니다. 예를 들어 이러한 테이블은 내 테이블 조인이며 내 필터입니다. 모든 성능 향상은 색인을 추가하는 것입니다. 이전 쿼리를 다시 시도 할 수 있으며 빠르게 실행해야합니다. –

1

만들기 NodeId (기본 키)이 아닌 노드의 name에 조인 모두 좋아 보이지 않습니다.

아마 당신은 외래 키 제약 조건을 추가하기 Results 테이블 대신 name에서 외래 키 senderreceiver에 대한 NodeId를 저장해야 너무 좋은 생각이다. 이 변화는 당신이 nodename 필드

에 고유성이 방식으로 테이블 정의를 변경하는 경우 시행한다 적어도, 어려운 경우 무엇보다도이 자동으로 구성

에 따라 인덱싱가 발생할 수 있습니다 , 쿼리를 John의 추천으로 변경하고 인덱스를 추가하여 더 잘 실행되고 훨씬 더 읽기 쉽도록/더 나은 형식으로 만들어야합니다.