Program2.0

테이블을 구성하는 3가지 포맷

Posted by: spaceufo on: August 8, 2008

mysql은 세가지 다른 테이블 포맷 : 고정길이, 다이나믹, 압축.

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

Leave a Reply

Spaceufo’s Twitter

Social code

Site Meter
Join My Community at MyBloglog!Add to Technorati Favoritesfree web stats Blog Ratings
My BlogCatalog BlogRank
마가린 바르기 bookmarkr.net metags WZD.com 네이버에 북마크 다음에 북마크 HanRSS에 북마크하기 이올린에 북마크하기 Pumfit에 글 올리기 del.icio.us에 북마크하기
Bookmark and Share