가입에 나는 다음과 같은 MySQL의 테이블 (전용 845 행)이 있습니다 MySQL의 - 전체 테이블 스캔 쿼리
CREATE TABLE `categories_nested_set` (
`lft` int(11) NOT NULL DEFAULT '0',
`rgt` int(11) DEFAULT NULL,
`id` int(11) DEFAULT NULL,
`category` varchar(128) DEFAULT NULL,
PRIMARY KEY (`lft`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `rgt` (`rgt`),
KEY `idx_lftrgtid` (`id`,`lft`,`rgt`),
KEY `idx_lft` (`lft`),
KEY `i1` (`lft`) USING BTREE,
KEY `i2` (`rgt`) USING BTREE,
KEY `i3` (`id`) USING BTREE,
CONSTRAINT `fk_categories_nested_set_id_category` FOREIGN KEY (`id`) REFERENCES `categories` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
가 (당신이 단지의 경우, 내가 거기에 인덱스의 전체 많이 볼 수 있습니다).
나는 다음과 같은 자체 조인 쿼리를 수행 생성
SELECT *
FROM categories_nested_set AS H
LEFT JOIN categories_nested_set AS I ON (H.lft > I.lft)
을 다음 EXPLAIN :
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,H,ALL,NULL,NULL,NULL,NULL,845,NULL
1,SIMPLE,I,ALL,"PRIMARY,idx_lft,i1",NULL,NULL,NULL,845,"Range checked for each record (index map: 0x31)"
은 MySQL이 사용하지 않는 선택하는 것을 제안 EXPLAIN 색인, 나는 왜 이해할 수 없다. 테이블 정의는 모든 관련 컬럼이 인덱싱됨을 보여줍니다.
엄청난 규모의 쿼리 (5 백만 행, 14x 테이블)의 범위에서이 부분은 막대한 병목 현상을 일으키는 것으로 입증되었습니다. 어떤 조언을 주시면 감사하겠습니다.
감사합니다,
'EXPLAIN'을 실행 한 데이터 세트에는 실제로 845 개의 행만 있습니까? 예를 들어 데이터 세트가 충분히 작은 경우, MySQL은 인덱스를 반드시 사용할 필요는 없습니다. 실제보다 큰 쿼리에 대한 성능 통계를 얻어야합니다. –
예, 단지 845 행. 큰 쿼리에 대해 다른 설명을하면 훨씬 더 정교하지만 그럼에도 불구하고 전체 테이블 검색. – mils
조인의 왼쪽에있는 표에 대해 전체 표 스캔을 하나 이상 수행해야합니다. –