2013-04-29 2 views
1

나는 간단한 테이블 구조처럼 보이지만, MySQL은 단순한 쿼리에서 기본값이 index_merge보다 적습니다. 여기 MySQL이이 쿼리에 대해 index_merge를 표시하는 이유는 무엇입니까?

는 테이블 구조입니다 :
CREATE TABLE IF NOT EXISTS `event_log` (
    `event_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(5) DEFAULT NULL, 
    `location_id` int(10) DEFAULT NULL, 
    `object_id` int(5) DEFAULT NULL, 
    `action_id` int(5) DEFAULT NULL, 
    `date_event` datetime DEFAULT NULL, 
    PRIMARY KEY (`event_id`), 
    KEY `user_id` (`user_id`), 
    KEY `date_event` (`date_event`), 
    KEY `action_id` (`action_id`), 
    KEY `object_id` (`object_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

EXPLAIN SELECT date_event 
FROM event_log 
WHERE user_id =123 
AND object_id =456 
AND location_id =789 

반환합니다 기본 SELECT 쿼리에 EXPLAIN이 :

select_type table  type   possible_keys  key     key_len  ref  rows Extra 
SIMPLE  event_log index_merge user_id,object_id object_id,user_id 5,5   NULL 27  Using intersect(object_id,user_id); Using where 

여기 쉽게 읽고에 대한 추가 비트가있다 :

Using intersect(object_id,user_id); Using where 

MySQL이이 쿼리에서 표준 인덱스를 사용하지 않는 이유는 무엇입니까? 왜 그것이 user_idobject_id을 교차합니까?

답변

4

쿼리에 가장 효과적인 인덱스는 세 필드를 모두 포함하는 복합 인덱스입니다 (예 : (object_id, user_id, location_id)). 그러한 인덱스가 없으므로, MySQL은 기존 인덱스로부터 대부분의 정보를 얻는 데 최선을 다합니다.

+0

잘 작동합니다. 설명 해줘서 고마워. –

+0

성능이 좋지 않습니까? 개별 색인으로 합성합니까? – Toleo

+0

@toleo와 같은 간단한 쿼리에서 mysql은 인덱스를 병합하여 사용할 수 있다고 추측 할 수 있지만 더 자주 사용하지 않으며 필수 열의 올바른 인덱스를 갖는 것이 좋습니다. 성능은 여러 요소에 따라 다릅니다. 인덱스를 사용하면 RDBMS가 전체 테이블보다 작은 정렬 된 데이터 하위 집합을 탐색 할 수 있지만 일반적으로 더 빠르지 만 인덱스는 메모리를 소비하므로 다른 방법으로 성능에 영향을 미칠 수 있습니다. – newtover

관련 문제