파티셔닝 개요
파티셔닝에서는 데이터를 여러개의 기록영역에 나누어서 기록하는 것을 의미한다.
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
이론 그대로이다.