2009년 3월 8일 일요일

고정사이즈일 때의 MYD

테이블이 고정크기일 경우에 1레코드는 다음과 같이 구성된다. 
  • 레코드헤더
  • 각 컬럼의 값
또 레코드헤더의 크기(바이트)는 다음과 같다. 
  • (int)( (1+NULL을 허용하는 컬럼수+7)/8
레코드의 헤더 비트 구성은 최하위 비트에서 다음과 같은 순서이다. 
  • X bit
  • Null bits
  • Filler bits
헤더가 0xf9의 경우
 oxf9 =  11111(filler bits) 00(null bits) 1 (X bit)

X bit는 그 레코드가 삭제 되었으면 0, 삭제되어있지 않으면 1이다. 
NULL을 허용하는 컬럼수만큼 Null bits가 할당된다. 이 비트가 1이면 대응하는 컬럼의 값이 NULL이다. 
Filler bits는 레코드헤더를 8비트 배수로 하기 때문에 1을 채워놓은 것에 불과하다. 
따라서 Filler bits의 비트수는 다음과 같이 된다. 
  • 8- (X bit의 수(항상1) + Null bits의 수) %8
레코드 헤더의 다음에 각 컬럼의 값이 계속해서 기록된다. 
CHAR()의 경우에는 값의 바이트수가 컬럼의 정의크기보다 적을 경우  부족한 부분에 0x20이 채워진다. 
CHAR()같이 문자를 처리하는 컬럼의 크기(바이트수)는 컬럼의 캐릭터셋에 좌우된다. 
(eucjpms등의 캐릭터셋 경우에는 정의문자수*3배가 필요하다. )

컬럼의 정보는 frm파일에 기록되어있으므로 MySQL자신은 MYD를 읽어 들일 때에는 이미 컬럼의 수와 정의를 알고 있다.  따라서   여기 글 이상의 정보는 MYD파일에는 있지 않다. 
실제로 MYD파일을 보면 다음과 같이 된다. 


MYD파일
mysql> create table fixed (a char(3), b char(5) ) default charset=eucjpms;
mysql> insert into fixed values( 'abc', 'def'), ('ghi', NULL) ;

shell> hexdump -C fixed.MYD 
f9 /61 62 63/ 20 20 20/ 20 20 20 /64 65 66 20 20 /20 20 20 20 20/20 20 20 20 20 
fd /67 68 69/20 20 20/ 20 20 20 /20 20 20 20 20 /20 20 20 20 20/20 20 20 20 20