2010년 10월 18일 월요일
테이블을 구성하는 3가지 포맷
mysql은 세가지 다른 테이블 포맷 : 고정길이, 다이나믹, 압축.
* 고정 길이 테이블(fixed row format)
o varchar, text, blob을 사용하지 않을 때.
o varchar로 지정해도 내부적으로 char로 처리
o 가능하다면 가급적 고정포맷을 사용하는 것이 좋다.
o 동적포맷보다 메모리사용이 적고, 인덱스파일크기도 작아진다. 당연히 속도 또한 향상된다.
o 파일구조의 고정길이레코드가 고정포맷, 가변길이레코드가 동적포맷이라고 생각해주면 이해하기 쉬울 것이다.
o 기본 포맷. 테이블에 VARCHAR, BLOB, TEXT 컬럼이 없을 때 사용.
o 모든 CHAR, NUMERIC, DECIMAL 컬럼은 컬럼 길이에 space-padded 이다. (** space-padded를 무엇이라고 번역해야 할지 애매모호해서 **)
o 매우 빠름
o 캐쉬하기 쉽다
o 손상 후 복구가 쉽다. 왜냐면 고정된 위이에 레코드가 위치하기 때문이다.
o 많은 양의 레코드가 지워졌거나 운영 시스템에서 자유 공간을 늘리길 원치 않는다면 (isamchk를 이용) 재조직화할 필요없다.
o 보통 다이나믹 테이블보다 많은 디스크 공간을 필요로 한다.
* 다이나믹 테이블(dynamic row format)
o varchar, text, blob을 사용할 때.
o AVG_ROW_LENGTH(힌트 개념), MAX_ROW(크기 넘어가면 안됨)
o varchar(3)보다 작다면 고정포맷이 사용됨 고정포맷에 비해 디스크사용에 있어 효율성을 가지나, 속도는 상대적으로 느리다.
o 테이블에 빈번한 레코드의 수정/삭제가 이루어지면 단편화가 유발하므로 주기적인 optimize table이 요구된다.
o text, blob은 별도로 저장되므로, optimize table을 수행할 필요성이 없다.
o mysql 쿼리 최적화 : AVG_ROW_LENGTH, MAX_ROW로 10%정도의 성능향상 기대할수 있음.
o 테이블이 VARCHAR, BLOB, TEXT 컬럼을 포함하고 있을 때 사용.
o 모든 문자열 컬럼은 다이나믹하다.(4보다 작은 길이를 가진 문자열 제외)
o 컬럼이 문자열 컬럼에서 비었거나 (”) 숫자형 컬럼에서 0(NULL 값을 가진 컬럼과 동일한 것이 아니다) 을 나타내는 비트맵이 모든 레코드 앞에 선행된다.
o 문자열 컬럼에서 trailing space를 제거한 후 zero의 길이를 가지거나 숫자형 컬럼이 zero의 값을 가지면 비트 맵으로 표시되고 디스크에 저장되지 않는다.
o 비지 않은 문자는 문자내용에 길이 바이트만큼 추가되어 저장된다.
o 보통 고정 길이 테이블보다 디스크 공간 절약.
o 줄의 길이를 확장하는 정보를 가지고 줄을 업데이트하면 줄은 단편화될 것이다.
o 이런 경우 더 좋은 성능을 위해 때때로 isamchk -r 을 실행해야 한다.
o 통계적으로(?) isamchk -ei tbl_name을 사용하자.
o 손상후 복구가 어렵다. 왜냐면 레코드가 많은 조각드로 단편화되고 링크(단편)가 없어지기 때문이다.
* 압축 테이블(compressed row format)
o 읽기전용이다. myisampack 명령어로 만들 수 있다.
o 디스크공간을 적게 차지하므로 CD에 백업할 때 사용하면 되겠다.
o fixed나 dynamic을 압축해서 저장할수 있음. (read only)
o 읽기 전용 테이블은 pack_isam 유틸리티로 만들 수 있다.
o 확장 mysql 이메일 지원을 구입한 모든 고객은 내부적인 용도로 pack_isam을 사용할 권리가 주어진다.
o 압축해제 코드는 모든 mysql 배포판에 있으므로 pack_isam이 없는 고객도 pack_isam으로 압축된 테이블을 읽을 수 있다. (테이블이 같은 플랫폼에서 압축되어 있는한)
o 매우 적은 디스크 용량을 사용.
o 각 레코드는 개별적으로 압축이 된다.
o ( 매우 적은 액세스 overhead) 레코드의 헤더는 테이블의 가장 큰 레코드에 따라 (1-3 바이트) 고정된다.
o 각 컬럼은 다르게 압축이 된다. 압축 타입은 다음과 같다:
+ 일반적으로 각 컬럼마다 다른 Huffman 테이블이다.
+ Suffic 공간 압축
+ Prefix 공간 압축
+ 0 값을 가진 숫자는 1비트로 저장.
+ integer 컬럼의 값이 작은 범위를 가졌다면, 컬럼은 최대한 작은 타입으로 저장된다.
+ 예를 들면 BIGINT 컬럼은 모든 값이 0부터 255라면 TINIINT 컬럼(1바이트)로 저장된다.
+ 컬럼이 몇가지 가능한 값으로만 구성되어 있다면, 컬럼 타입은 ENUM으로 변환된다.
+ 컬럼은 위 압축 방법을 조합하여 사용한다.
o 고정 길이나 다이나믹 길이의 테이블을 다룰 수 있다. 그러나 BLOB나 TEXT 컬럼은 다룰 수 없다.
o isamchk로 압축을 해재할 수 있다.
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기