레이블이 MYD포맷인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MYD포맷인 게시물을 표시합니다. 모든 게시물 표시

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 


 





2009년 3월 2일 월요일

MYD의 압축,포맷

MyISAM의 MYD파일을 myisampack명령어로 압축할 수 있다. 압축후에는 원래크기의 50%~70%정도의 크기로 된다. 
압축한 파일에 대해서는 쓰기가 되지 않는다. 

압축예
shell# myisampack -v table1 
shell# myisamchk -rq table1

압축후에는 myisamchk를 실행해야 한다. 
압축를 풀 때에는 「myisamchk -r  --unpack 테이블」을 사용한다. 

MYD에는 다음의 3종류가 있다. 
  • fixed(고정크기)
  • dynamic(가변크기)
  • packed(압축)
테이블에 varchar(), text, blob형을 정의하면 가변크기가 된다. myisampack으로 MYD를 압축해서  읽기 전용 테이블로 만들면 packed로 된다.