"Real MySQL" 책을 정리한 포스팅 입니다.
1. 저장공간
CHAR (고정 길이)
- 선언한 길이만큼 크기가 정해집니다.
- 입력한 데이터 이외의 남은 크기의 공간은 빈 공간으로 채워집니다.
- 검색 속도가 빠릅니다.
VARCHAR (가변 길이)
- 데이터가 정해진 크기보다 작은 값일 경우, 그만큼 저장공간에 할당됩니다.
길이 접두사
- 255 바이트 이하: 1바이트
- 256 바이트 이상: 2바이트
저장공간
- 최대 64KB를 저장할 수 있습니다. (길이 접두사 포함)
- 전체 row에 크기 제한이 있으므로 varchar 필드도 제한에 적용됩니다.
- 다른 컬럼에서 40KB 이상 사용하고 있다면 나머지 컬럼에선 24KB만 사용할 수 있습니다.
- 24KB를 초과할 경우 TEXT 혹은 BLOB 타입으로 변환됩니다.
문자 집합 (캐릭터 셋)
- 문자를 컴퓨터에서 처리하기 위해 숫자에 매핑하는 체계
- 데이터베2이스에서 사용하는 특정한 인코딩 방식을 의미합니다.
utf8mb4
- 한글자당 1~4바이트까지 사용합니다.
- 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_system: 객체의 식별자를 저장할 때 사용하는 문자 집합
- character_set_database: 데이터베이스 기본 문자 집합
- character_set_filesystem: 파일의 이름을 찾을 때 사용하는 문자 집합
- character_set_client: 클라이언트가 보낸 문장을 인코딩하는 문자 집합
- character_set_connection : 커넥션에서 사용하는 문자 집합
- character_set_results : 서버가 쿼리의 처리 결과를 클라이언트로 보낼 때 인코딩하는 문자 집합
콜레이션
- 문자열 컬럼의 값에 대한 비교나 정렬 순서를 위한 규칙을 의미한다.
- 문자열 값들을 어떻게 비교하고 정렬할 지 결정합니다.
독립적인 문자 집합과 콜레이션
- 모든 문자열 타입의 칼럼은 독립적인 문자 집합과 콜레이션을 가집니다.
다중 콜레이션 지원
- 문자 집합은 2개 이상의 콜레이션을 가지고 있습니다.
- 하나의 문자 집합에 속한 콜레이션은 다른 문자 집합과 공유해서 사용할 수 없습니다.
디폴트 콜레이션
- 문자 집합은 자신의 디폴트 콜레이션을 가지고 있습니다.
- 콜레이션을 명시적으로 지정하지 않았다면, 비교 및 정렬시에 디폴트 콜레이션을 사용합니다.
문자 집합의 묵시적 결정
- 콜레이션만 지정하면 콜레이션에 소속된 문자 집합이 묵시적으로 해당 컬럼의 문자 집합이 됩니다.
타입 일치 결정
- 타입의 이름과 길이 뿐만 아니라 콜레이션까지 일치해야 같은 타입입니다.
- 콜레이션이 다르다면 인덱스 사용에서 추가적인 비교연산이 들어가므로 효율적인 사용을 위해 확인해야 한다.
설정
- 테이블의 컬럼이나 DB 수준에서 개별적으로 설정할 수 있다.
- information_schema의 COLUMNS 뷰를 확인하여 테이블의 콜레이션을 확인할 수 있다.
구성
utf8mb4_unicode_ci;
- 첫번째 파트: 문자 집합
- 두번째 파트: 문자 집합의 하위 분류 or bin
- 세번째 파트: 대소문자 구분 여부 (ci, cs)
저장 공간과 스키마 변경
Online DDL
- 데이터가 변경되는 도중에도 스키마 변경을 할 수 있도록 하는 기능입니다.
- 크기 변경이 64KB가 넘어가면 데이터 크기 저장 공간이 늘어나므로 COPY Migration을 해야합니다.
- 비용이 많이 듭니다.
2. TEXT, BLOB
- 대용량 문자열을 처리하는 타입입니다.
- 길이가 예측할 수 없이 클 때(64KB 이상) 사용합니다.
- 인덱스 컬럼으로 사용할 경우 3072바이트 까지 허용됩니다. (InnoDB)
- TEXT (DYNAMIC or COMPRESSED)(utf8bm4): 최대 768 글자까지
- TEXT (DYNAMIC or COMPRESSED)(latin1): 최대 3072 글자 까지
- 길이에 따른 여러 하위 타입이 있습니다.
TEXT
- 문자 데이터용
- row 블록 별도에 둠 (수정 시에 row데이터 변화 가능성 X)
BLOB
- 이진 데이터용
- 별도의 문자집합이나 콜레이션을 가지지 않습니다.
- io가 일어남. (이미지)
필요저장공간 (L = 저장하고자 하는 데이터의 바이트 수) |
|
TINYTEXT, TINYBLOB | L+1byte |
TEXT, BLOB | L+2byte |
MEDIUMTEXT, MEDIUMBLOB | L+3byte |
LONGTEXT, LONGBLOB | L+4byte |
시스템 변수
- max_sort_length: 설정된 바이트까지만 정렬을 수행합니다.
- max_allowed_packet: 서버로 전송하는데 제한되는 SQL 문장 크기
- innodb_default_row_format: 대용량 문자열이 저장되는 포맷
포맷
REDUNDANT
- 최대 768 바이트까지는 B-Tree 인덱스에 저장하고, 초과하는 부분은 Off-Page에 저장합니다.
- 768 바이트보다 큰 고정길이 컬럼은 가변길이 컬럼으로 인코딩되어 Off-Page에 저장됩니다.
COMPACT
- 모든 포맷의 근간이며 기본적으로 사용됩니다.
- CPU 성능을 사용하여 데이터를 압축하여 공간을 20% 정도 줄여줍니다.
- 레코드 하나의 최대 길이: 8KB (데이터 페이지 크기의 절반)
- 최대 768 바이트까지는 B-Tree 인덱스에 저장하고, 초과하는 부분은 Off-Page에 저장합니다.
DYNAMIC
- Compact에 효율적인 처리 규칙이 추가된 버전 입니다.
- BLOB, TEXT 및 기타 가변 길이 필드를 더 효율적으로 처리합니다.
- 외부 페이지에 저장하여 메인 데이터 페이지의 공간을 절약합니다.
COMPRESSED
- DYNAMIC에 압축관련 규칙이 추가된 버전 입니다.
- 추가적인 성능이 필요합니다.
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 15-3. 데이터 타입: 날짜와 시간 (0) | 2023.11.26 |
---|---|
[Real MySQL] 15-2. 데이터 타입: 숫자 (0) | 2023.11.26 |
[Real MySQL] 8-2. 인덱스: 구현 (B-Tree) (0) | 2023.11.25 |
[Real MySQL] 8-1. 인덱스 (0) | 2023.11.25 |
[Real MySQL] 5-1. 트랜잭션과 잠금 (0) | 2023.11.24 |