백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.
1. 저장 공간
타입
항목 | CHAR | VARCHAR |
저장 방식 | 고정 길이 | 가변 길이 (입력한 데이터 길이 + 길이 접두사 저장) |
남는 공간 처리 | 부족한 공간은 공백으로 채움 | 남는 공간 없음 |
검색 속도 | 빠름 | 느림 (길이 접두사로 인한 오버헤드) |
길이 접두사 | 없음 | 있음 (255B 이하: 1바이트, 256B 이상: 2바이트) |
저장 공간 제한 | 최대 255자 | row 최대 크기내에서 가능 (길이 접두사 포함) |
전체 Row 크기 제한 | 상대적으로 영향 적음 | 다른 컬럼 사용량에 따라 제한됨 (여유 공간 내에서 사용 가능) |
2. 대용량
- 64KB 이상의 데이터를 저장할 때 사용
- 가변 길이 타입
- 별도의 공간에 저장됨
타입
항목 | TEXT | BLOB |
데이터 용도 | 문자열 데이터 | 이진 데이터 (이미지, 파일 등) |
문자 집합 | ✅ | ❌ |
Collation | ✅ | ❌ |
저장 위치 | Row 외부에 별도 저장 (포인터만 row에 존재) | 동일 |
인덱스 길이 제한 (InnoDB) | utf8mb4: 최대 768자 latin1: 최대 3072자 |
동일 |
입출력 성능 | 일반적인 문자열 처리 속도 | 느림 (파일 I/O 수준의 접근) |
크기
타입 | 최대 크기 | 필요 저장 공간 (L = 데이터 크기) |
TINYTEXT, TINYBLOB | 255 바이트 | L + 1바이트 |
TEXT, BLOB | 65,535 바이트 (64KB) | L + 2바이트 |
MEDIUMTEXT, MEDIUMBLOB | 16,777,215 바이트 (16MB) | L + 3바이트 |
LONGTEXT, LONGBLOB | 4,294,967,295 바이트 (4GB) | L + 4바이트 |
포맷
종류 | 기본 설명 | 인덱스 저장 방식 | 기타 특징 |
REDUNDANT | MySQL 5.0 이전 포맷 | 최대 768바이트까지 B-Tree 인덱스에 저장 초과 시 Off-Page 부분 분리 |
오래된 버전 호환용 공간 효율 낮음 |
COMPACT | MySQL 5.0 이후 기본 포맷 | 최대 768바이트까지 B-Tree 인덱스에 저장 초과 시 Off-Page 부분 분리 |
데이터 구조 최적화 (공간 약 20% 절약) |
DYNAMIC | COMPACT 개선형 | 최대 768바이트까지 B-Tree 인덱스에 저장 초과 시 Off-Page 전체 분리 |
메인 페이지 공간 절약 (대용량 문자열/LOB에 유리) |
COMPRESSED | DYNAMIC + 압축 기능 적용 | 저장 구조는 DYNAMIC과 동일 | 저장 공간 절약 극대화 (CPU 사용량 증가 가능성 있음) |
시스템 변수
- max_sort_length: 설정된 바이트까지만 정렬을 수행합니다.
- max_allowed_packet: 서버로 전송하는데 제한되는 SQL 문장 크기
- innodb_default_row_format: 대용량 문자열이 저장되는 포맷
3. Character Set
- 문자를 숫자에 매핑하는 체계
- 데이터베이스에서 사용하는 인코딩 방식
타입
인코딩 방식 | 문자 크기 (바이트) | 이모지 지원 | 주요 특징 및 용도 |
utf8mb4 | 영어: 1B 한중일 문자: 3B 이모지: 4B |
✅ | - UTF-8의 확장형 - 다국어 + 이모지 포함 가능 - MySQL 권장 설정 |
UTF-8 | 문자당 1~3B | ❌ | - utf8mb4의 서브셋 - 이모지 미지원 - 대부분의 웹 환경 기본 인코딩 |
EUC-KR | 문자당 1~2B | ❌ | - 한국어 완성형만 지원 - 레거시 시스템에서 사용됨 |
MS949 | 문자당 1~2B (EUC-KR보다 확장) | ❌ | - Windows 기본 한글 인코딩 - CP949와 동일 |
시스템 변수
- character_set_server: 기본 문자 집합
- character_set_database: 데이터베이스 기본 문자 집합
- character_set_system: 객체의 식별자를 저장할 때 사용하는 문자 집합
- character_set_filesystem 파일의 이름을 찾을 때 사용하는 문자 집합
- character_set_connection: 커넥션에서 사용하는 문자 집합
- character_set_client: 클라이언트가 보낸 문장을 인코딩하는 문자 집합
- character_set_results: 서버가 쿼리의 처리 결과를 클라이언트로 보낼 때 인코딩하는 문자 집합
4. Collation
- 문자열 비교 및 정렬 규칙
- 같은 문자 집합이라도 콜레이션이 다르면 정렬 순서가 달라질 수 있음
특징
항목 | 설명 |
문자 집합 독립성 |
콜레이션은 문자 집합에 속하지만, 개념상 비교/정렬 규칙으로써 독립적 역할을 함
|
문자열 칼럼 설정 |
모든 문자열 타입의 컬럼은 자체적으로 문자 집합과 콜레이션을 가짐 (테이블/DB와 무관하게 개별 설정 가능)
|
다중 콜레이션 지원 |
하나의 문자 집합은 여러 개의 콜레이션을 가질 수 있음
|
콜레이션-문자 집합 연결 |
특정 문자 집합에 속한 콜레이션은 다른 문자 집합에서 사용할 수 없음
|
디폴트 콜레이션 |
문자 집합마다 기본 콜레이션이 있으며, 명시적으로 설정하지 않으면 이를 사용함
|
묵시적 문자 집합 결정 |
콜레이션만 지정해도, 그 콜레이션에 해당하는 문자 집합이 자동으로 컬럼에 적용됨
|
타입 일치 조건 |
데이터 타입 비교 시 이름, 길이, 콜레이션까지 일치해야 완전히 같은 타입으로 간주됨
|
인덱스 연산 영향 |
콜레이션이 다르면 인덱스 비교 시 내부적으로 추가 변환/비교 연산이 수행됨
|
구성
utf8mb4_unicode_ci;
- 첫번째 파트: 문자 집합
- 두번째 파트: 문자 집합의 하위 분류 or bin (이진 값으로 비교)
- 세번째 파트: 대소문자 구분 여부 (ci, cs)
Online DDL
- 데이터가 변경되는 도중에도 스키마 변경을 할 수 있도록 하는 기능입니다.
- 64KB를 초과하는 크기 변경이 발생하면 COPY Migration을 해야합니다. (데이터 크기 저장 공간이 늘어나므로)
- 비용이 많이 듭니다.
설정
- 테이블의 컬럼이나 DB 수준에서 개별적으로 설정할 수 있다.
- information_schema의 COLUMNS 뷰를 확인하여 컬럼의 콜레이션을 확인할 수 있다.
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 15-3. 데이터 타입: 날짜와 시간 (0) | 2023.11.26 |
---|---|
[Real MySQL] 15-2. 데이터 타입: 숫자 (0) | 2023.11.26 |
[Real MySQL] 8-3. 인덱스: 알고리즘 - B-Tree Index (0) | 2023.11.25 |
[Real MySQL] 8-2. 인덱스 (0) | 2023.11.25 |
[Real MySQL] 5-1. 트랜잭션과 잠금: 트랜잭션 (1) | 2023.11.24 |