Mysql에 스트링으로 저장할까? 숫자형으로 저장할까?
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
바로 이 부분이다.
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바이트까지 필요하다고 한다.