백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.
1. 저장공간
CHAR
- 선언한 길이만큼 고정된 크기로 저장됨
- 부족한 공간은 공백으로 채움
- 검색 속도가 빠름 (오버헤드 없음)
VARCHAR
- 입력한 데이터 크기 만큼만 저장됨
길이 접두사
- 데이터별 길이 접두사가 추가됩니다.
- 255 바이트 이하: 1바이트
- 256 바이트 이상: 2바이트
저장공간
- 최대 64KB를 저장할 수 있습니다. (길이 접두사 포함)
- 전체 row에 크기 제한이 있습니다.
- 다른 컬럼에서 40KB 이상 사용하고 있다면 나머지 컬럼에선 24KB만 사용할 수 있습니다.
- 24KB를 초과할 경우 TEXT 혹은 BLOB 타입으로 변환됩니다.
2. 대용량 문자열
- 가변 길이 타입입니다.
- 64KB 이상의 데이터를 저장할 때 사용
- 64KB 이상의 데이터는 별도의 공간에 저장됨
TEXT
문자열
- 문자 집합과 콜레이션 적용 가능
- row 블록 별도에 둠 (수정 시에 row 데이터 변화 가능성 X)
인덱스 컬럼 제한 (InnoDB)
- utf8bm4: 최대 768 글자까지
- latin1: 최대 3072 글자 까지
BLOB
이진 데이터
- 파일, 이미지 용
- i/o가 일어남
- 문자 집합과 콜레이션 적용 불가능
타입 | 필요 저장 공간 (L = 저장하고자 하는 데이터의 바이트 수) |
TINYTEXT, TINYBLOB | L + 1byte |
TEXT, BLOB | L + 2byte |
MEDIUMTEXT, MEDIUMBLOB | L + 3byte |
LONGTEXT, LONGBLOB | L + 4byte |
포맷
REDUNDANT
- 최대 768 바이트까지는 B-Tree 인덱스에 저장
- 초과하는 부분은 외부 영역에 저장합니다. (Off-Page)
COMPACT
- 기본적으로 사용되는 포맷
- 최대 768 바이트까지는 B-Tree 인덱스에 저장하고, 초과하는 부분은 Off-Page에 저장합니다.
- 데이터 압축
- 공간을 20% 정도 줄여줍니다.
- 레코드 하나의 최대 길이: 8KB (데이터 페이지 크기의 절반)
DYNAMIC
- Compact의 개선된 버전 (처리 규칙 추가)
- 외부 페이지에 저장하여 메인 데이터 페이지의 공간을 절약합니다.
COMPRESSED
- DYNAMIC에 추가적인 압축 기능 적용
- 저장 공간 절약 효과가 큼
- CPU 오버헤드 발생
시스템 변수
- max_sort_length: 설정된 바이트까지만 정렬을 수행합니다.
- max_allowed_packet: 서버로 전송하는데 제한되는 SQL 문장 크기
- innodb_default_row_format: 대용량 문자열이 저장되는 포맷
3. 문자 집합
- 문자를 숫자에 매핑하는 체계
- 데이터베이스에서 사용하는 인코딩 방식
utf8mb4
크기
- ASCII(영어권): 1바이트
- 아시아권 언어: 3바이트
- UTF-8 (emoji): 4바이트
특징
- 다국어 문자를 포함할 수 있는 칼럼에 적합합니다.
- 메모리에 기록될 경우 문자열 길이에 관계없이 문자당 4바이트로 할당됩니다.
UTF-8
- utf8mb4의 서브셋
- 한글자당 1~3바이트까지 사용합니다.
- 이모지는 사용 불가합니다.
EUC-KR
- 한국어 전용으로 사용되는 문자 집합 (완성형 한글만 지원)
- 모든 문자는 1~2바이트를 사용합니다.
MS949
- EUR-KR보다 조금 더 확장된 문자 집합
- 윈도우에서 기본적으로 사용되는 한글 문자 인코딩
- CP-949와 똑같은 문자 집합 (유닉스 운영체제에서 사용)
시스템 변수
- character_set_server: 기본 문자 집합
- character_set_database: 데이터베이스 기본 문자 집합
- character_set_system: 객체의 식별자를 저장할 때 사용하는 문자 집합
- character_set_filesystem 파일의 이름을 찾을 때 사용하는 문자 집합
- character_set_connection: 커넥션에서 사용하는 문자 집합
- character_set_client: 클라이언트가 보낸 문장을 인코딩하는 문자 집합
- character_set_results: 서버가 쿼리의 처리 결과를 클라이언트로 보낼 때 인코딩하는 문자 집합
4. 콜레이션
- 문자열 비교 및 정렬 규칙
- 같은 문자 집합이라도 콜레이션이 다르면 정렬 순서가 달라질 수 있음
특징
문자 집합으로부터 독립적
- 모든 문자열 타입의 칼럼은 독립적인 문자 집합과 콜레이션을 가집니다.
다중 콜레이션 지원
- 문자 집합은 2개 이상의 콜레이션을 가지고 있습니다.
- 특정 문자 집합에 속한 콜레이션은 다른 문자 집합에서 사용할 수 없습니다.
디폴트 콜레이션
- 문자 집합은 자신의 디폴트 콜레이션을 가지고 있습니다.
- 콜레이션을 명시적으로 지정하지 않았다면, 비교 및 정렬시에 디폴트 콜레이션을 사용합니다.
문자 집합의 묵시적 결정
- 콜레이션만 지정하면 콜레이션에 속한 문자 집합이 묵시적으로 해당 컬럼의 문자 집합이 됩니다.
타입 일치 결정
- 타입의 이름과 길이 뿐만 아니라 콜레이션까지 일치해야 같은 타입입니다.
- 콜레이션이 다르다면 인덱스 사용에서 추가적인 비교 연산이 수행됨
구성
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 (0) | 2023.11.25 |
[Real MySQL] 8-2. 인덱스 (0) | 2023.11.25 |
[Real MySQL] 5-1. 트랜잭션과 잠금: 트랜잭션 (1) | 2023.11.24 |