2011-09-27 3 views
3

다중 선택 이름 (테이블이 호출 할 때 '코드'), 상위 개체의 ID (parent_id) 및 다중에서 선택된 옵션 이름을 저장하는 InnoDB MYSQL 테이블이 있습니다.MySQL에서 DISTINCT 쿼리 속도 향상

CREATE TABLE IF NOT EXISTS `v2_CA_venue_option_name` (
    `name_id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`name_id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Venue Option Names' AUTO_INCREMENT=60 ; 

나는 최적화하고 싶다고 : 선택 (name_id.error가) :

CREATE TABLE IF NOT EXISTS `v2_CA_venue_option_map` (
    `map_id` int(11) NOT NULL auto_increment, 
    `code` varchar(30) NOT NULL, 
    `parent_id` int(11) NOT NULL, 
    `name_id` int(11) NOT NULL, 
    PRIMARY KEY (`map_id`), 
    UNIQUE KEY `3way_unique` (`code`,`parent_id`,`name_id`), 
    KEY `name_id` (`name_id`), 
    KEY `filter` (`code`,`name_id`), 
    KEY `parent_id` (`parent_id`), 
    KEY `code` (`code`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=875156 ; 

와 이름을 저장하는 간단한 표 (그 쿼리에 사용하기 때문에 나는이 보여 거라 생각) 다음 검색어 :

,128,는

이 쿼리는 실행하는 데 약 600ms의 소요 궁금 해서요 :

  1. 나는이 별개의 쿼리 속도를 테이블에 인덱스를 배치 할 수 있다면.
  2. 더 나은 성능으로 어떻게 동일한 결과를 얻을 수 있습니까?

다음은 위 쿼리에 대한 설명입니다.

enter image description here

UPDATE, 내 두 번째 질문을 제거했습니다.

UPDATE 이것은 속도를 높이는 가장 좋은 방법은 출력을 별도의 테이블에 한 번 저장 한 다음 그 테이블을 호출하는 것입니다.이 테이블은 쿼리를 충분히 빠르게 수행 할 수 없으므로 내 요구와 색인이 DISTINCT 쿼리에 도움이되지 않는 것 같습니다.

+1

질문이 여러 개인 경우, 사람들이 도움을받을 가능성이 높으므로 여러 질문을 만들어야합니다. – Igor

+1

또한 조회에 대한 Explain 플랜을 붙여 넣기를 원할 수도 있습니다. MySQL의 최적화 도구가 무엇을하는지 보는 것이 도움이 될 것입니다. –

+0

이 쿼리를 실행하는 데 걸리는 시간과 반환되는 행 수는 얼마나됩니까? 'v2_CA_venue_option_map에서 name_id를 선택하십시오. 여기서 code = "a_event_types"group by name_id' – Karolis

답변

0

별개의 게으른 group by을 사용해보십시오. mysql이 걱정해야 할 열이 하나 더 적습니다.

SELECT name_id, name 
FROM `v2_CA_venue_option_map` 
JOIN `v2_CA_venue_option_name` 
    USING (name_id) 
WHERE code = "a_event_types" 
GROUP BY name_id 
+1

나는 [이 하나] (http://stackoverflow.com/questions/581521/whats-faster-select-distinct-distinct-or-group-by-in-mysql)와 같은 기사는 뚜렷한 것이 빠르다고 말하고있다. . – RonSper

+0

맞습니다. 모든 열을 그룹화하는 경우 name_id 만 그룹화하십시오. 이 쿼리는 몇 개의 결과를 제공합니까? btw? –

+1

위의 쿼리는 약 0.5153 초 실행됩니다. 이것은 19 결과를 제공합니다. – RonSper

0

당신은이 조인에서 쿼리를 변경하려고 할 수있는 EXISTS를 사용, 반 가입 할 수 있습니다. DISTINCT :

SELECT name_id 
    , name 
FROM v2_CA_venue_option_name AS n 
WHERE EXISTS 
     (SELECT * 
     FROM v2_CA_venue_option_map AS m 
     WHERE m.name_id = n.name_id 
      AND m.code = 'a_event_types' 
    ) 
+1

제안에 감사드립니다. 총 19 건의 쿼리는 5.6770 초가 걸렸으며 DISTINCT의 성능에도 미치지 못했습니다. – RonSper

+0

'(name_id, code)'인덱스를 추가 할 수 있습니까? –