내 테이블 (프로젝트) (인덱스를 사용하고 계십니까?) :MySQL의 : 여러 범위에서 선택 행을 최적화
당신이다시피id, lft, rgt
1, 1, 6
2, 2, 3
3, 4, 5
4, 7, 10
5, 8, 9
6, 11, 12
7, 13, 14
, 이것은 nested set model를 사용하여 계층 적 데이터입니다. 나무가 꽤 인쇄 :
1
2
3
4
5
6
7
는 내가 함께 할 수있는 프로젝트 1과 4에서 모든 하위 프로젝트를 선택합니다 그러나
SELECT p.id
FROM projects AS p, projects AS ps
WHERE (ps.id = 1 OR ps.id = 4)
AND p.lft BETWEEN ps.lft AND ps.rgt
을,이 큰 테이블과 매우 느립니다 (쿼리) EXPLAIN 실행 내가 얻을 :
+----+-------------+-------+-------+------------------------+---------+---------+------+------+-------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------------+---------+---------+------+------+-------------------------------------------------+
| 1 | SIMPLE | ps | range | PRIMARY,lft,rgt,lftRgt | PRIMARY | 4 | NULL | 2 | Using where |
| 1 | SIMPLE | p | ALL | lft,lftRgt | NULL | NULL | NULL | 7040 | Range checked for each record (index map: 0x12) |
+----+-------------+-------+-------+------------------------+---------+---------+------+------+-------------------------------------------------+
(. 프로젝트 테이블 LFT, RGT, 및 LFT-RGT에 인덱스가 당신이 볼 수 있듯이, MySQL은 어떤 인덱스를 사용하지 않으며, 7040 개 레코드를 루프)
+----+-------------+-------+-------+------------------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | ps | const | PRIMARY,lft,rgt,lftRgt | PRIMARY | 4 | const | 1 | |
| 1 | SIMPLE | p | range | lft,lftRgt | lft | 4 | NULL | 7 | Using where |
+----+-------------+-------+-------+------------------------+---------+---------+-------+------+-------------+
드디어, 내 질문 :
SELECT p.id
FROM projects AS p, projects AS ps
WHERE ps.id = 1
AND p.lft BETWEEN ps.lft AND ps.rgt
가 설명 :
나는 단지 슈퍼 프로젝트 중 하나를 선택하면, MySQL은 인덱스를 사용하여 관리하는 것으로 나타났습니다 나는 거기에 여러 범위와 일치하는 행을 선택하고 인덱스에서 여전히 이익을 얻을 수있는 방법이 있습니까?
:(내가 아는 대답은 아니지만 적어도 시간을 낭비하지 말고 알아내는 것이 좋습니다. – Joernsn