2009년 5월 10일 일요일

InnoDB의 인덱스

InnoDB에서는 레코드 저장에 「Clustered Index」라는 특별한 인덱스를 채용하고 있다. 

1. Clustered Index
InnoDB에서는 clustered index라는 인덱스를  한 테이블당  한개 작성한다. 
이것은 B+ Tree인덱스이다. 
인덱스의 Leaf에 실레코드가 직접저장된다. 
clustered index는 primary키를 중심으로 인덱스를 작성하고 있다. 
만약 사용자가 테이블에  primary 키 또는 unique키를 정의하지 않았을 경우 , InnoDB자신이 
내부에 자동적으로 primary키 대신의 것을 생성하고 그것에 따라서 인덱스를 만든다. 

InnoDB가 자동적으로 할당한 것은 사용자는 볼 수 없다. 
InnoDB에서는 이 clustered index키를 중심으로  행 lock를 동작시킨다. 

따라서 만약에 사용자가 primary 키 또는 unique 키를 테이블에 정의해놓지 않으면 행 lock은 동작하지 않으므로 주의 해야한다. 

2. Secondary Index
Secondary Index는  Primary 키이외의 인덱스에 대해서 작성되는 것이다. 
인덱스 leaf에 primary 키의 값과 non-primary키가 셋트로 기록된다. 

primary 키이외의 키가 query에서 사용되었을 경우 이 secondary index가 탐색되어 판명된 primary 키를 중심으로 레코드를 읽어 냄으로  2단계 처리가 이루어짐으로 검색의 속도가 떨어진다. 
secondary index의 소트 알고리즘도 B+ tree이다. 
또 한개의 non-unique인덱스당 한개가 작성된다. 

3. Adaptive Hash Index
테이블이   거의 메모리에서 처리가능할 때 InnoDB는 자동적으로 이 테이블의 hash index를 메모리(buffer pool)안에 작성한다.  이 인덱스를 사용하면  키 값으로 부터 레코드의 기술 위치를 알 수 있다. 이것이 Adaptive Hash Index이다. 

모든것이 index화되어서 buffer pool에서 넣어지는 것이 아니라 액세스 빈도가 많은 것이 있으면 그것에 맞추어서 작성된다. 

레코드 검색시 B+ tree 인덱스를 검색하기 전에 Adaptive Hash Index를 조사한다. 
만약 Adaptive Hash Index에 레코드의 기술위치정보가 있으면  그 밖의 B+ Tree 인덱스 검색은 건너뛰고 직접 레코드를  읽어들이게 된다.