논리 모델링 업무에 대한 이해가 많이 필요
엔티티 속성 관계 도출 정규화 작업 업무적인 요건 모델링
어느정도 적당한 소프트웨어 개발 경험이 필요함.
물리 모델링은 DBMS의 종류와 기능 성능에 이해가 필요함
종류별로 최적의 컬럼 타입 데이터의 접근 패턴을 분석해서 인덱스 전량 수립 및 반정규화 등 성능 적 요소 모델링 적용
문자셋은 각 문자를 어떻게 인코딩할지 결정합니다.
문자셋에 따라 같은 글자 수라도 실제 저장에 필요한 바이트 수가 달라집니다.
캐릭터와 바캐릭터 타입의 컬럼 모두 어떤 문자셋으로 정의되었느냐에 따라 사용하는 저장공간 크기가 달라짐
EX) 라틴1 문자셋을 사용하는 캐릭터쉽과 VARCHAR타입 컬럼은 최대 10글자 까지 저장하지만
라틴 1문자만 저장할 수 있기 때문에 최대 10바이트까지만 사용할수 있게 됨
영어, 숫자, 일부 특수문자만 저장 가능하다는 제한이 있음
UTF-8은 가변 길이 인코딩 방식
문자에 따라 1~4바이트를 사용할 수 있다
영어 알파벳: 1바이트per문자 (10글자 = 10바이트)
한글: 3바이트per문자 (10글자 = 30바이트)
특정 이모지: 4바이트per문자 (10글자 = 40바이트)
CHAR(10)이나 VARCHAR(10)으로 정의해도 실제 저장 공간은 10~40바이트가 될 수 있음
UTF-8 MB4문자셋을 사용하는 캐릭터와 VARCHAR타입 컬럼 경우 10글자 까지 저장할 수 있긴 하지만
저장하는 글자의 문자셋이 UTF-8이기 때문에 최소 10 바이트에 최대 40바이트 사용할수 있게 됨
UTF-8 문자셋은 가변 길이 문자셋이기 때문에 영어 알파벳 10글자가 저장되면 10 바이트 사용하고
한글 10글자를 저장하면 30바이트 특정 이모지는 40바이트까지 사용할수 있게됨
- CHAR는 고정길이 저장 (저장되는 문자의 값의 길이에 관계없이 최대 설정된 크기만큼 항상 공간 할당 사용)
- 예: CHAR(10)에 'ABC'를 저장하면 10바이트를 모두 사용
- 최대 255 문자까지 저장 가능
- VARCHAR는 가변길이 저장( 실제 저장된 문자열의 길이만큼만 공간을 사용)
- 예: VARCHAR(10)에 'ABC'를 저장하면 실제로는 3바이트만 사용
- VARCHAR 16000 문자까지 저장
- CHAR 저장된 값의 길이를 별도 관리 안함
- 일반적으로 CHAR는 길이 정보를 저장하지 x
- 그러나 UTF-8 MB4와 같은 가변 길이 문자셋을 사용할 경우, CHAR도 VARCHAR처럼 길이 정보를 저장
- 이는 가변 길이 문자셋에서는 문자당 사용하는 바이트 수가 다를 수 있기 때문
- VARCHAR 저장된 문자열 값의 실제 바이트수를 관리하는 길이 저장 바이트가 있는데
- VARCHAR는 항상 저장된 문자열의 실제 길이 정보를 함께 저장
- 이 길이 정보는 1바이트 또는 2바이트를 사용 (밑에 랑 같은말)
- 필요에 따라서 1바이트에 2바이트까지 사용
- 이 길이 정보는 데이터 앞부분에 추가
- 255바이트 이하의 데이터: 길이 정보에 1바이트 사용
- 255바이트 초과 데이터: 길이 정보에 2바이트 사용
오랜만에 기억이안나서 그림도..
VARCHAR(100)에 'Hello' 저장 시:
데이터 길이: 5바이트
길이 정보: 1바이트 (255 이하이므로)
총 사용 공간: 6바이트 (5 + 1)
VARCHAR(1000)에 300바이트 길이의 텍스트 저장 시:
데이터 길이: 300바이트
길이 정보: 2바이트 (255 초과이므로)
총 사용 공간: 302바이트 (300 + 2)
이유
- 1바이트로는 0-255까지의 값만 표현 가능
- 더 긴 문자열의 길이를 저장하려면 2바이트가 필요
장점
- 짧은 문자열에 대해서는 공간을 절약
- 긴 문자열도 효율적으로 저장
CHAR 타입경우 UTF-8 MB4 문자셋 사용경우 한글잔즌 최대 4바이트 사용할 수 있어서
최대 40바이트까지 빈공백 예약할수 있는 것처럼 보임
실제 MYSQL 서버는 빈 공백 공간을 예약할 때에는 문자의 개수보다 바이트수로 빈 공백 공간을 예약해두도록 작동
즉 한글 두글자를 저장하면 한글 한글자는 3바이트를 사용하기 때문에 FD2컬럼에는 6바이트를 사용 함.
결론적으로 FD2 컬럼에 4개의 빈 공백 공간만 예약해 둠
만약 한글 네글자가 저장되면 실제 12바이트 저장공간이 필요하게 됨
그래서 12 바이트가 저장됨. 4글자가 12바이트를 사용하기 때문에 CHAR 10컬럼 타입에 정의도니 길이 10보다 더 큰 길이여서 추가로 빈 공간을 더 할당해 두지 않음. 캐릭터 타입이라 하더라도
UTF-8 MB4와 같은 가변 길이 캐릭터셋을 사용하는 경우 예약해 두는 빈 공간이 단순한 부족한 글자 수만큼 아님
때론 예약된 빈공간 없음
이런 특성으로 인해 UTF-8 MB4와 같은 가변 길이 문자셋을 사용하는 CHAR타입 경우 VHARCHAR와 조금 비슷하게 동작
그리고 가변길이 문자셋인경우 캐릭터 타입이라 하더라도 실제 저장된 문자의 값이 사용하는 바이트수가
별도로 관리 되어야함
UTF-8 MB4는 가변길이 문자셋이기 때문에 여기 그림에서도 10과 12라는 숫자값이
컬럼 앞단에 표시되는걸 확인함.
VARCHAR는 실제 저장된 값이 사용하는 공간만 할당됨. 문자셋 상관없이 항상 꼭필요한 문자셋 공간만 할당함
CHAR(10)에서
VARCHAR에서
이유: UTF8MB4는 가변 길이 문자셋이므로 CHAR 타입도 VARCHAR와 유사하게 동작합니다. 실제 사용된 바이트 수에 따라 저장 공간이 결정