프로그래밍

Mysql에 스트링으로 저장할까? 숫자형으로 저장할까?

2kindsofcs 2020. 2. 14. 11:14

Q. 앞으로 계산할 일도 없고, 수정할 일도 없는, 무조건 참조만 할, 적당히 작은 숫자가 있다. 이걸 숫자형으로 저장하는 게 좋을까, 아니면 스트링으로 저장하는 게 좋을까? 혹은 어느 쪽을 선택해도 상관없을까? 

 

A. 어지간해서는 숫자형으로 저장하는 게 좋다!

 

해당 수가 -32768 ~ 32767 범위일 경우 (Unsigned의 경우에는 0 ~ 65535), 이를 숫자형으로 저장하기 위해서는 2바이트가 필요하다. 

 

반대로 문자열은 몇 바이트가 필요할까? utf8mb4 언어셋으로 5개 길이의 문자열로 저장한다고 가정하자. 

(5 * (문자열의 길이) * 4바이트) + 크기값 저장용 1바이트 = 21바이트

 

즉 하나의 데이터마다 19바이트씩 더 필요하다. 1000개를 저장한다고 가정하면, 단순히 계산해도 19000bytes = 19kB 정도 저장공간이 더 필요하다. 따라서 숫자형으로 저장하면 그만큼의 저장공간 소모를 막을 수 있다. 

 

그런데 utf8mb4는 4바이트 아닌가? 크기값 저장용 1바이트는 뭐지? 

그에 대한 해답은 아래 링크에 있다. 

https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings

 

MySQL :: MySQL 8.0 Reference Manual :: 11.7 Data Type Storage Requirements

11.7 Data Type Storage Requirements The storage requirements for table data on disk depend on several factors. Different storage engines represent data types and store raw data differently. Table data might be compressed, either for a column or an entire r

dev.mysql.com

 

바로 이 부분이다. 

TINYBLOB, TINYTEXT

L + 1 bytes, where L < 28

 

Variable-length string types are stored using a length prefix plus data. The length prefix requires from one to four bytes depending on the data type, and the value of the prefix is L (the byte length of the string). 

 

가변 길이 문자열은 저장될 때 문자열 데이터의 바이트 길이와 실제 데이터가 함께 저장된다. 이 길이 저장용 prefix는 문자열 타입에 따라서 1바이트에서 4바이트까지 필요하다고 한다. 

 

 

반응형

'프로그래밍' 카테고리의 다른 글

ORM vs ODBC  (0) 2020.02.24
golang module을 사용해보자.  (2) 2020.02.21
pub/sub 구조란 무엇인가  (0) 2020.02.12
A Tour of Go Exercise - Web Crawler 풀이  (0) 2020.02.11
golang 에서 nil 이란 무엇인가  (0) 2020.02.11