2012-11-05 5 views
1

안녕하세요. 데이터베이스를 최적화하는 방법에 대한 도움을 받으실 수 있기를 기대하면서 일년이 걸리지 않으 셨습니다. 속도를 높이기 위해 색인을 추가해야하지만 정확히 무엇을 추가해야하는지 잘 모르겠습니다.MySQL 데이터베이스/쿼리를 최적화하는 방법

는 Heres는 내 데이터베이스에있는 3 개 개의 테이블 :

CREATE TABLE IF NOT EXISTS `journeyPattern2` (
    `journeyPatternId` int(11) NOT NULL AUTO_INCREMENT, 
    `serviceId` int(11) NOT NULL, 
    `direction` enum('inbound','outbound') NOT NULL, 
    PRIMARY KEY (`journeyPatternId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `journeyPatternTimingLink2` (
    `journeyPatternTimingLinkId` int(11) NOT NULL AUTO_INCREMENT, 
    `journeyPatternId` int(11) NOT NULL, 
    `from` varchar(15) NOT NULL, 
    `to` varchar(15) NOT NULL, 
    `direction` enum('inbound','outbound') NOT NULL, 
    `runTime` varchar(15) NOT NULL, 
    PRIMARY KEY (`journeyPatternTimingLinkId`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

CREATE TABLE IF NOT EXISTS `line` (
    `lineId` int(11) NOT NULL AUTO_INCREMENT, 
    `serviceId` int(11) NOT NULL, 
    `lineName` tinytext NOT NULL, 
    PRIMARY KEY (`lineId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

CREATE TABLE IF NOT EXISTS `service` (
    `serviceId` int(11) NOT NULL AUTO_INCREMENT, 
    `serviceCode` varchar(50) NOT NULL, 
    `registeredOperatorRef` varchar(50) NOT NULL, 
    `origin` tinytext NOT NULL, 
    `destination` tinytext NOT NULL, 
    PRIMARY KEY (`serviceId`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

journeyPattern2 약 33000 행을 포함하는 테이블은 journeyPatternTimingLink2은 약 70000.

쿼리 내가 노력하고있어 1300 만, 라인 및 서비스를 포함 최적화는 다음과 같습니다

SELECT DISTINCT lineName,line.serviceId FROM `journeyPatternTimingLink2` 
INNER JOIN journeyPattern2 
ON journeyPattern2.journeyPatternId=journeyPatternTimingLink2.journeyPatternId 
INNER JOIN line 
ON journeyPattern2.serviceId = line.serviceId 
WHERE `from` = '13006785E' 

나는이 크기의 테이블을 실제로 사용하지 못했습니다. 그래서 저는 제가 c에 합류하는지 확실하지 않습니다. 제 1 장소에서 orrectly. 또한 screenshot을 phpmyadmin의 쿼리에 EXPLAIN을 실행하여 업로드했습니다. 그러나 결과를 해석하여 어떤 도움을 받으실 지 확신 할 수 없습니다.

도움 주셔서 감사합니다.

+0

첫째, 귀하의 질문이 정말로 느리거나 사전에 최적화하고 싶습니까? –

+0

그래, 내가 위의 게시물을 실행하는 데 매우 느린, 50 초. – Jack

+0

당신의 explain 회담이 journeyPattern2의 330141 행에 대해 말했고, 위에서 33000 행은 맞습니까? –

답변

1

당신은이 필드에 어떤 인덱스를 추가해야합니다 -

  • line.serviceId
  • journeyPatternTimingLink2을 journeyPattern2.serviceId journeyPatternTimingLink2.journeyPatternId. from

JOIN-ON 절 및 WHERE 조건에 사용되는 색인입니다.

1

가장 중요한 색인은 journeyPatternTimingLink2.from이어야합니다. 이는 where 절에 있고 다른 모든 테이블보다 두 개의 행이 더 많기 때문입니다.

모든 테이블에 InnoDB를 사용할 수도 있습니다. Optimization Overview에서 : MySQL의 5.5

이상, InnoDB는 새로운 테이블의 기본 스토리지 엔진이다. 실제로, 고급 InnoDB 성능은 을 의미하는데, 특히 InnoDB 테이블이 더 복잡한 MyISAM 테이블보다 성능이 뛰어날 때, 바쁜 데이터베이스의 경우 이 특히 유용합니다.

5

당신은 어떤 외래 키 또는 인덱스 아래에 언급 된 컬럼에 추가해야합니다 :

  1. service에서 serviceId 열 참조를 추가 journeyPatternTimingLink2
  2. journeyPattern2에서 jouurneyPatternId 컬럼에 대한 참조를 추가하기 journeyPattern2
  3. 에 참조 추가 line

service에서열 journeyPatternTimingLink2 테이블에 from 컬럼에 인덱스를 추가합니다.

+0

myisam 엔진을 사용하는 테이블에서 외래 키를 추가 할 수 없습니다. –

+0

성능을 향상시키는 해당 열에 인덱스를 추가하십시오. –

관련 문제