2009-10-20 3 views
3

MPTT (Modified Pre-order Tree Traversal)를 사용하여 계층 적 데이터를 저장하는 테이블을 만들었습니다. 각 노드는 자손을 찾기 위해 leftright ID를 저장합니다. . 나는 각 행에 parent_id을 포함시킴으로써 표준 방식과 다른 CakePHP 제안 모델을 사용하고 있습니다.제안 된 MPTT 테이블의 인덱스

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    parent_id INTEGER(10) DEFAULT NULL, 
    lft INTEGER(10) DEFAULT NULL, 
    rght INTEGER(10) DEFAULT NULL, 
    name VARCHAR(255) DEFAULT '', 
    PRIMARY KEY (id) 
); 

이전에이 스타일을 사용한 적이 데, 정확히이 검색됩니다 방법을 모르고, 나는 궁금하네요 내가 인덱싱해야 필드 : 여기

는 제안 된 테이블 구조인가? 기본 키만으로 충분합니까? 아니면 lftrght도 포함해야합니까?

답변

1

일반적으로 왼쪽 열에 만 색인을 생성합니다. 나는 대개 실행 계획에서 테이블 당 하나의 인덱스 사용자 만 허용하는 mysql을 사용하며, 왼쪽의 인덱스는 MPTT 테이블에 대해 작성한 모든 쿼리를 지원하며 해당 인덱스의 권한을 최소화하는 데 도움이됩니다.

간단히 말해서, 왼쪽의 단일 색인은 거의 모든 유스 케이스의 삽입/업데이트 속도와 선택 속도 간의 최적의 균형입니다.

4

항상 왼쪽 열을 사용하지만 모든 잎 노드를 자주 찾아야합니다.

WHERE lft = (rgt -1) 

그래서 대개 lft, rgt 쌍으로 색인을 만듭니다.

+3

. 대부분의 나무는 쓰여지는 것보다 훨씬 더 많이 읽 힙니다. 그래서 왼쪽과 오른쪽에 두 개의 칼럼 인덱스 (두 개의 별도 인덱스가 아님)를 갖는 것이 좋습니다. 또한 동일한 표에 여러 트리를 저장하는 경우 (예 : grouping_id, left, right에 대해 3 열 인덱스로 만듭니다. – Walf

관련 문제