2009년 3월 20일 금요일

InnoDB

InnoDB 기본개념하고 레코드 관리방법에 대해서 설명하기 전에 트랜잭션과 락(lock)에 대해서 알아보자. 
왜냐하면 스토리지엔진이 다르면 지원내용이나 동작이 조금씩 다르기 때문이다. 

InnoDB가 제공하는 지원내용
  • 레코드 락(lock)
  • 트랜잭션
  • Multi versioning
  • 4개의 트랜잭션 분리레벨
  • 외부키 제약 

2009년 3월 10일 화요일

각 타입의 크기( MYD )

MYD파일 각 타입에 필요한 크기는 다음과 같다. 
----------------------------------
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8
FLOAT 4
DOUBLE PRECISION 8
DECIMAL 6~30
----------------------------------
DATE 3
DATETIME 8
TIME 3
TIMESTAMP 4
----------------------------------
SET 1~8
ENUM 1~2
----------------------------------
TINYBLOB 1+값의 크기
BLOB 2+값의 크기
LONGBLOG 4+값의 크기
----------------------------------


2009년 3월 9일 월요일

가변크기일 경우의 MYD

가변 크기일 경우의 레코드 헤더는 다음과 같다. 
  • 헤더 시작마크(0x3000)
  • actual  length
  • unused length
  • flags + overflow pointer
actual length는  전 칼럼의 합계 바이트 수이다. 
unused length는  자신의 레코드 끝에서부터 다음의 레코드의 처음까지의 사이에 있는 미사용부분 바이트 수이다.  여기에 0x00이 채워져있다. 
actual length+unused length는 16진수로 자르기 좋은 수로 최소 16(10진수)가 된다. 

overflow pointer는 레코드가 연속되지 않는 여러 부분에 기록되어 있는 경우에 나머지가 기록되어 있는 위치를 나타낸다. 

헤더의 다음에는  각 컬럼의 값이 계속된다.  varchar()의 경우에는 값의 바이트수가 추가되고 그 뒤에 실제의 값이 들어가게 된다. 

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

shell# hexdump -C dynamic.MYD
1레코드: 03 00 09 07 fc 03 62 62 63  03 64 65 66 00 00 00 00 00 00 00 
2레코드: 03 00 06 0a fe 03 67 68 69  00 00 00 00 00 00 00 00 00 00 00 





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로 된다.