• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 1. InnoDB 소개
    2. InnoDB의 개념과 아키텍처
    1. MySQL 과 ACID 모델
    2. InnoDB 트랜잭션 모델 및 잠금
    3. InnoDB 잠금 모드
    4. 일관성 nonlock 읽기
    5. 잠금 읽기 (SELECT ... FOR UPDATE 및 SELECT ... LOCK IN SHARE MODE)
    6. InnoDB 레코드 격차 및 넥스트 키 잠금
    7. 넥스트키 로크에 의한 팬텀 문제 해결
    8. InnoDB의 다양한 SQL문에서 설정된 잠금
    9. 암시적 트랜잭션 커밋과 롤백
    10. 교착 상태 감지 및 롤백
    11. 교착 상태 해결 방법
    12. InnoDB 멀티 버전
    13. InnoDB 테이블 및 인덱스 구조
    1. InnoDB 테이블의 .frm 파일의 역할
    2. 클러스터 인덱스와 보조 인덱스
    3. FULLTEXT 인덱스
    4. InnoDB 인덱스의 물리적 구조
    5. 삽입 버퍼
    6. 적응 형 해시 인덱스
    7. 물리적 행 구조
    3. InnoDB 구성
    4. InnoDB 관리
    5. InnoDB 테이블 스페이스 관리
    6. InnoDB 테이블 관리
    7. InnoDB 압축 테이블
    8. InnoDB 파일 형식 관리
    9. InnoDB Row Storage and Row Formats
    10. InnoDB 디스크 I/O 및 파일 영역 관리
    11. InnoDB와 온라인 DDL
    12. InnoDB 부팅 옵션 및 시스템 변수
    13. InnoDB의 성능
    14. InnoDB INFORMATION_SCHEMA 테이블
    15. InnoDB 모니터
    16. InnoDB 백업 및 복구
    17. InnoDB와 MySQL 복제
    18. InnoDB 및 memcached의 통합
    19. InnoDB 문제 해결
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

14.2.13.7 물리적 행 구조

InnoDB 테이블의 실제 행 구조는 테이블 생성시 지정된 행 형식에 따라 다릅니다. InnoDB 의 기본은 Antelope 파일 형식과 COMPACT 행 형식이 사용됩니다. REDUNDANT 형식은 이전 MySQL 버전과의 호환성을 위해 사용할 수 있습니다. 섹션 14.9 "InnoDB의 행 스토리지 및 행 형식" 과 섹션 14.7 "InnoDB 압축 테이블" 에서 설명하도록 innodb_file_per_table 설정을 사용하면 새로운 Barracuda 파일 형식을 DYNAMIC 및 COMPRESSED 행 형식과 함께 사용할 수 있습니다.

InnoDB 테이블의 행 형식을 확인하려면 SHOW TABLE STATUS 를 사용합니다. 예 :

  mysql> SHOW TABLE STATUS IN test1 \ G
 *************************** 1. row ******************** *******
            Name : t1
          Engine : InnoDB
         Version : 10
      Row_format : Compact
            Rows : 0
  Avg_row_length : 0
     Data_length : 16384
 Max_data_length : 0
    Index_length : 16384
       Data_free : 0
  Auto_increment : 1
     Create_time : 2014-10-31 16:02:01
     Update_time : NULL
      Check_time : NULL
       Collat​​ion : latin1_swedish_ci
        Checksum : NULL
  Create_options : 
         Comment : 
 1 row in set (0.00 sec) 

INFORMATION_SCHEMA.INNODB_SYS_TABLES 에서 쿼리를 실행하면 InnoDB 테이블의 행 형식을 확인하실 수 있습니다.

mysql> SELECT NAME, ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test1/t1';
+----------+------------+
| NAME     | ROW_FORMAT |
+----------+------------+
| test1/t1 | Compact    |
+----------+------------+

COMPACT 행 형식을 사용하면 행의 저장 공간이 약 20 % 감소하지만 일부 작업에서는 CPU 사용률이 높아집니다. 워크로드가 캐시 적중률과 디스크 속도에 의해 제한되는 일반적인 워크로드라면 COMPACT 형식이 빠를 수 있습니다. 작업 부하가 CPU 속도에 의해 제한되는 드문 경우는 COMPACT 형식이 느려질 수 있습니다.

REDUNDANT 행 형식을 사용하는 InnoDB 테이블의 행에는 다음과 같은 특성이 있습니다.

  • 각 인덱스 레코드는 6 바이트 헤더가 포함되어 있습니다. 이 헤더는 연속 된 레코드를 연결하는 데 사용됩니다. 또한 행 수준 잠금으로도 사용됩니다.

  • 클러스터 된 인덱스의 레코드는 모든 사용자 정의 컬럼의 필드가 포함됩니다. 또한 6 바이트의 트랜잭션 ID 필드와 7 바이트 역할 포인터 필드도 포함되어 있습니다.

  • 테이블에 기본 키가 정의되지 않은 경우, 각 클러스터 된 인덱스 레코드에 6 바이트의 행 ID 필드도 포함되어 있습니다.

  • 각 보조 인덱스 레코드는 보조 인덱스에 존재하지 않는 클러스터 된 인덱스 키에 정의 된 모든 기본 키 필드도 포함되어 있습니다.

  • 레코드는 레코드의 각 필드에 대한 포인터가 포함됩니다. 레코드의 필드 길이의 합계가 128 바이트 미만의 경우는 포인터가 1 바이트 128 바이트 이상의 경우는 포인터가 2 바이트입니다. 이러한 포인터의 배열은 레코드 디렉토리라고합니다. 이 포인터가 가리키는 영역 레코드의 데이터 부분이라고합니다.

  • InnoDB 는 내부적으로 고정 길이 형식의 CHAR(10) 등의 고정 길이 문자 컬럼이 포함됩니다. InnoDB 는 VARCHAR 컬럼에서 후행 공백을 자르지 않습니다.

  • SQL의 NULL 값은 레코드 디렉토리에 1 바이트 또는 2 바이트가 예약됩니다. 그외에도 SQL의 NULL 값은 가변 길이 컬럼에 저장되는 레코드의 데이터 부분에 0 바이트가 예약됩니다. 고정 길이 컬럼에서는 레코드의 데이터 부분에 컬럼의 고정 길이가 예약됩니다. NULL 값에 고정 영역을 예약하면 인덱스 페이지의 조각화가 발생하지 않고 컬럼을 NULL 에서 비 NULL 값을 업데이트 할 수 있습니다.

COMPACT 행 형식을 사용하는 InnoDB 테이블의 행에는 다음과 같은 특성이 있습니다.

  • 각 인덱스 레코드는 전에 가변 길이 헤더가 붙는 수있는 5 바이트의 헤더가 포함되어 있습니다. 이 헤더는 연속 된 레코드를 연결하는 데 사용됩니다. 또한 행 수준 잠금으로도 사용됩니다.

  • 레코드 헤더의 가변 길이 부분에는 NULL 열을 나타내는 비트 벡터가 포함되어 있습니다. NULL 로 할 수있는 인덱스의 컬럼 수가 N 인 경우는 비트 벡터에서 CEILING( N /8) 바이트가 점유됩니다. (예를 들어, NULL 로 할 수있는 열이 9에서 15까지의 숫자 만 존재하는 경우, 비트 벡터로 2 바이트가 사용됩니다.)이 벡터의 비트 이외의 영역은 NULL 컬럼에서 점유되지 않습니다. 헤더의 가변 길이 부분에는 가변 길이 컬럼의 길이도 포함되어 있습니다. 각 길이는 컬럼의 최대 길이에 따라 1 바이트와 2 바이트 중 하나입니다. 인덱스의 모든 컬럼이 NOT NULL 이면서 고정 길이 인 경우 레코드 헤더는 가변 길이 부분이 포함되지 않습니다.

  • 비 NULL 가변 길이 필드마다 레코드 헤더에 1 바이트 또는 2 바이트의 컬럼 길이가 포함됩니다. 컬럼의 일부가 외부 오버 플로우 페이지에 저장되거나 최대 길이가 255 바이트를 초과 실제 길이가 127 바이트를 초과하는 경우에만 2 바이트가 필요합니다. 열이 외부에 저장된 경우 2 바이트 길이는 내부에 포함 된 부분의 길이에 외부에 저장된 부분에 20 바이트의 포인터를 더한 길이를 나타냅니다. 안 부분은 768 바이트이기 때문에 길이는 768 + 20입니다. 20 바이트의 포인터는 그 컬럼의 실제 길이가 포함됩니다.

  • 레코드 헤더 다음에는 비 NULL 컬럼의 데이터 내용이 나옵니다.

  • 클러스터 된 인덱스의 레코드는 모든 사용자 정의 컬럼의 필드가 포함됩니다. 또한 6 바이트의 트랜잭션 ID 필드와 7 바이트 역할 포인터 필드도 포함되어 있습니다.

  • 테이블에 기본 키가 정의되지 않은 경우, 각 클러스터 된 인덱스 레코드에 6 바이트의 행 ID 필드도 포함되어 있습니다.

  • 각 보조 인덱스 레코드는 보조 인덱스에 존재하지 않는 클러스터 된 인덱스 키에 정의 된 모든 기본 키 필드도 포함되어 있습니다. 이러한 기본 키 필드 중 하나가 가변 길이 인 경우, 각 보조 인덱스 레코드 헤더에는 그 보조 인덱스가 고정 길이 컬럼에 정의되어있는 경우에도 그 필드의 길이를 기록하기위한 가변 길이 부분이 포함됩니다.

  • InnoDB 는 내부적으로 고정 길이 형식의 CHAR(10) 등의 고정 길이 고정 폭 문자 컬럼이 포함됩니다. InnoDB 는 VARCHAR 컬럼에서 후행 공백을 자르지 않습니다.

  • InnoDB 는 후속 영역을 잘라내는 내부적으로 UTF-8 CHAR( N ) 컬럼을 N 바이트로 저장하려고합니다. ( REDUNDANT 행 형식으로이 같은 열에서 3 × N 바이트를 차지합니다.) 많은 경우는 최소 영역 N 을 예약하면 인덱스 페이지의 조각화가 발생하지 않고 컬럼의 업데이트를 성공적으로 실행할 수 있습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved