2010년 8월 25일 수요일

파티셔닝2

파티셔닝 개요

파티셔닝에서는 데이터를 여러개의 기록영역에 나누어서 기록하는 것을 의미한다.
MySQL의 파티셔닝은 수평 파티셔닝(horizontal partitioning)이라고 불리우는 방법으로 수행한다.

이것은 어떤 컬럼의 값에 따라서  레코드를 기록하는 장소를 바꾸는 방법이다.
이외에도 수직형 파티셔닝(vertical partitioning)처럼 나누는 방법도 있지만 MySQL은 서포트하고 있지 않다. (현재는 잘 모름.. )

다시말하면 수직형 파티셔닝에서는  "이 컬럼은  이쪽 파티션에 기록하고 저컬럼은 저쪽 파티션에 기록한다" 처럼 컬럼에 착목한 분할이 된다.


파티셔닝기본동작

파티셔닝이 어떻게 동작하는지  사용해보면서 알아보자.

 MyISAM테이블  mycom의 작성 

mysql> CREATE TABLE mycom( a INT) ENGINE=MyISAM
     PARTITION BY RANGE(a) (
         PARTITION pt0 VALUES LESS THAN (1000) ENGINE=MyISAM, 
         PARTITION pt1 VALUES LESS THAN (2000) ENGINE=MyISAM,
        PARTITION pt2 VALUES LESS THAN  MAXVALUE  ENGINE=MyISAM) ;


 이 때 데이터베이스의 디렉토리에는 다음과 같은 파일이 작성된다.

데이터베이스 디렉토리의 내용(MyISAM테이블)
mycom#P#pt0.MYD
mycom#P#pt0.MYI
mycom#P#pt1.MYD
mycom#P#pt1.MYI
mycom#P#pt2.MYD
mycom#P#pt2.MYI
mycom.frm
mycom.par

다시 말하면,  어떤 MyISAM 테이블을 파티셔닝하면  다음과 같은 파일이 생성된다.

테이블.frm
테이블.par
테이블#P#파티션이름.MYD(데이터)
테이블#P#파티션이름.MYI(인덱스)

.par파일은 바이너리 파일로  파티셔닝 정보를 기록한다.

.par파일의 내용 (일부)
shell# hexdump -C mycom.par
00000000 08 00 00 00 7e 7d 3a 00 03 00 00 00 09 09 09 00 
00000010 0c 00 00 00 70 74 30 00 70 74 31 00 70 74 32 00 
00000020

 그럼, InnoDB의 경우는 어떻게 될까?   아까전에 만든 mycom테이블을 ALTER TABLE문으로 InnoDB로 변경해 보자.

데이터베이스디렉토리는 다음과 같은 파일이 생성된다.

mycom.frm
mycom.par

InnoDB  형식에 따라서  테이블의  데이터와 인덱스부분은  InnoDB의  테이블 영역으로 이동되었다.   그럼 InnoDB의 --innodb_file_per_table옵션을 사용했을 때에는 파티셔닝은 어떻게 될까?  실행해보면  파일은 다음과 같이 되었다.

mycom#P#pt0.ibd
mycom#P#pt1.ibd
mycom#P#pt2.ibd
mycom.frm
mycom.par


이론 그대로이다.