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_id
과 object_id
을 교차합니까?
잘 작동합니다. 설명 해줘서 고마워. –
성능이 좋지 않습니까? 개별 색인으로 합성합니까? – Toleo
@toleo와 같은 간단한 쿼리에서 mysql은 인덱스를 병합하여 사용할 수 있다고 추측 할 수 있지만 더 자주 사용하지 않으며 필수 열의 올바른 인덱스를 갖는 것이 좋습니다. 성능은 여러 요소에 따라 다릅니다. 인덱스를 사용하면 RDBMS가 전체 테이블보다 작은 정렬 된 데이터 하위 집합을 탐색 할 수 있지만 일반적으로 더 빠르지 만 인덱스는 메모리를 소비하므로 다른 방법으로 성능에 영향을 미칠 수 있습니다. – newtover