나는 다음과 같은 자체 조인 쿼리를 가지고 :MySQL을 - 자동 가입하기 - 전체 테이블 스캔 (인덱스를 스캔 할 수 없습니다)
SELECT A.id
FROM mytbl AS A
LEFT JOIN mytbl AS B
ON (A.lft BETWEEN B.lft AND B.rgt)
쿼리는 매우 느리다 및 실행 계획보고 후 원인으로 나타납니다 JOIN에서 전체 테이블을 검사합니다. 이 테이블은 단지 500 개의 행을 가지고 있으며 이것이 이것이 최적화 도구의 선택과 다른 점이 있는지를보기 위해 100,000 개의 행으로 증가 시켰습니다. 100KB 행으로 전체 테이블 스캔을 계속하고있었습니다.
내 다음 단계는 다음과 같은 쿼리를 시도하고 힘 인덱스했다,하지만 같은 상황은 전체 테이블 스캔을 발생 :
SELECT A.id
FROM categories_nested_set AS A
LEFT JOIN categories_nested_set AS B
FORCE INDEX (idx_lft, idx_rgt)
ON (A.lft BETWEEN B.lft AND B.rgt)
모든 열 (ID, LFT, RGT) 정수이고, 모두 색인이 생성됩니다.
왜 MySql이 전체 테이블 스캔을 수행합니까?
전체 테이블 검색 대신 색인을 사용하도록 쿼리를 변경하려면 어떻게해야합니까?
CREATE TABLE mytbl (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_lft (lft),
KEY idx_rgt (rgt)) ENGINE=InnoDB DEFAULT CHARSET=utf8
덕분에
주 쇼'의 결과가 각 관련 XYZ 아래 – Drew
결과 테이블 xyz'를 만들 : 쿼리의 고정 및 고정되지 않은 버전 사이에 기능을 EXPLAIN의 비교 '표 mytbl을 만듭니다 ( LFT의 INT (11) NOT NULL DEFAULT '0' RGT의 INT (11) 초기 NULL, 아이디 INT (11) 초기 NULL, 카테고리 VARCHAR (128) 초기 NULL, PRIMARY KEY (LFT) UNIQUE KEY ID (id), UNIQUE KEY rgt (rgt), KEY idx_l KEY idx_rgt (rgt) ) ENGINE = InnoDB DEFAULT CHARSET = utf8' – mils
'PRIMARY KEY'는'UNIQUE' 키가'KEY'입니다. 따라서 두 개의 KEY는 중복되어 제거되어야합니다. –