IT Study/데이터베이스

MySQL 운영 노하우(Know-how) II - DATA TYPE 알고 쓰자!

ComputerScientist 2023. 7. 18. 00:23

(읽기 전 주의)

이 글은 개인의 경험에 의해 작성된 것이므로, 100% 정답이 아니며, 더 다양한 방법, 더 나은 방법이 존재할 수 있습니다. 또한, 자세한 설명보다는 왜 운영 노하우로 선정했는지, 흔히 하는 실수가 무엇인지, 내가 놓쳤던 것들은 무엇인지에 대한 이해를 돕기 위해, 비교적 간단하게 경험을 바탕으로 설명하고 있습니다 (혹은, 설명하려고 노력하고 있습니다).

 

 

이 글은 계속해서 운영하면서 실수하거나, 동료들이 쉽게 놓치거나 하는 부분을 계속해서 추가해 나갈 것입니다.

또한, 좋은 팁들이 있다면 댓글에 공유 부탁드립니다!

 

 

(이번 2편에서는 DATA TYPE에 대해 실수 혹은 놓치고 있는 부분들에 대해, 길게 기록해 두도록 하겠습니다)

 


1편 보러가기

 

MySQL 운영 노하우(Know-how) I

(읽기 전 주의) 이 글은 개인의 경험에 의해 작성된 것이므로, 100% 정답이 아니며, 더 다양한 방법, 더 나은 방법이 존재할 수 있습니다. 또한, 자세한 설명보다는 왜 운영 노하우로 선정했는지,

itseminar.tistory.com

 

 

MySQL DATA TYPE에 대해 알고 쓰자!

 

1. 작은 데이터 타입을 사용하라!

어떻게 보면 가장 기본적인 내용일 수 있겠으나, 내가 경험하면서 실수했던 부분들 혹은 잘 몰랐던 부분에 관해 기술하면서, data type이 왜 중요한지 설명하려 한다. 우선 필수적으로 알아야 할게, "일반적으로 작은 데이터 타입일수록 쿼리 실행 속도가 빠르다."

그 이유는 기본적으로


1. 메모리 사용이 감소하고,
2. 작은 데이터 타입을 스캔하는데 드는 I/O가 감소한다.
3. 또한 인덱스 서치를 할 경우, 검색해야 할 인덱스 크기가 감소할 것이고,
4. CPU 연산 또한 감소할 것이다.

 

일반적으로 작은 데이터 타입일수록 쿼리 실행 속도가 빠르다.

 

이게 무슨 말이냐, 만약 집 안에서 핸드폰을 어디 뒀는지 잊어먹었다. 그래서 지금 핸드폰을 찾고 있다고 가정해 보자.
집이 10평일 때, 100평일 때, 1000평일 때, 핸드폰을 찾는 데 드는 시간이 같을까? (어디 뒀었던 것 같은 데의 기억은 인덱스의 영역!)

바꿔 말해, 데이터의 메모리가 10bit인 곳에서 숫자 1을 찾는 것과, 100bit일 때 1을 찾는 것, 1,000bit일 때 1을 찾는 건, 성능상 확연하게 차이가 난다는 뜻이다.

(TINYINT) 1

(INT) 00......01
(BIGINT) 00...............01


포인터가 앞에서부터 1인지 0인지 확인해 본다고 가정했을 때, BIGINT 때의 포인터는 1을 찾기 위해서 얼마나 가야 하는 걸까....?

 

 

 

 

2. VARCHAR? CHAR?

또, 흔히 대충 넘어가는 부분이 VARCHAR와 CHAR 형태이다. 결론부터 얘기하면, 업데이트가 자주 없으나, string의 길이가 예측이 불가능할 때 VARCHAR를 사용하는 게 좋고, 업데이트가 자주 있으며, 길이가 정해져 있다면 CHAR를 쓰는 게 좋다.

 

업데이트가 자주 없으나, string의 길이가 예측이 불가능할 때 VARCHAR를 사용하는 게 좋고, 업데이트가 자주 있으며, 길이가 정해져있다면 CHAR를 쓰는 게 좋다.

 

우선 간단하게 설명하면 CHAR는 fixed-length라고 하여, 길이가 고정되어있는 String이고,

VARCHAR는 variable-length라고 하여, 길이가 변할 수 있는 String이다.

 

CHAR(10)의 경우, "a"를 저장하여도  10 bytes의 저장공간을 차지하지만,

VARCHAR(10)에 "a"를 저장하는 경우에는 1 byte의 저장공간을 사용한다.

 

이것만 보면, 무조건 VARCHAR를 사용하면 좋은 게 아닌가 싶다. 우리가 컴퓨터의 능력 얘기할 때는,
사용 볼륨뿐만 아니라, 속도에 대한 퍼포먼스도 같이 얘기한다. VARCHAR가 좋을 때는, 볼륨(저장공간)을 절약할 수는 있다. 하지만, 이 경우를 생각해 보자.


공책이 있다.

이제 나는 지금 생각을 노트에 적는다.
"I AM VERY HUNGRY."

 

근데, 너무 배고픈 나머지 VERY라는 단어로는 표현할 수가 없다. 그래서 나는 EXTREMLY라는 단어로 대체하려고 한다.

 

CASE1

만약 VERY라는 필드를 VARCHAR(10)로 사용하여 뒤에 여유 공간이 없다면, 뒤에 HUNGRY도 지우고, EXTREMLY HUNGRY를 다시 써야 할 것이다. 근데 만약 HUNGRY 뒤에 수많은 단어가 더 붙어있었다면?
그럼, 뒤에 문장을 모두 지우고, 뒤에 문장을 다시 다 써야 할 것이다.


CASE2
그럼 만약에 VERY를 CHAR(10)으로 해두었다면? VERY만 지우고, 그자리에 EXTREMLY 만 넣고 업데이트되었을 것이다.

 

컴퓨터 디스크에 똑같이 기록되어 있다고 가정하면, UPDATE(갱신)했을 경우에는, 속도의 차이가 분명히 있을 것이다.

 

이 처럼 어플리케이션 사용성에 맞는 데이터 타입을 쓰는 것은 매우 중요하다!

 

 

 

 

마지막으로,

3. (간단 팁) INET_ATON

IP를 저장할 때는 INT UNSIGNED로 사용하고 INET_ATON, INET_NTOA를 사용해라! 1번에 사용했던 내용과 같이, 작은 데이터 타입을 쓰면 더 유용하다!

 

IP를 저장할 때는 INT UNSIGNED로 사용하고 INET_ATON, INET_NTOA를 사용해라!



SELECT INET_ATON('127.0.0.1) => 2130706433
SELECT INET_NTOA(2130706433) => 127.0.0.1

참고로 여기서 A는 Address (주소)의 약자이고, N은 (Natural Number) 자연수이다.


N이 그냥 Number를 뜻하는 건가....?