테이블 설계 또한 잘하자.
테이블을 설계할 때 타입도 잘 정의하자
- CHAR vs VARCHAR
- CHAR(100) 에 ‘abc’가 들어가는 경우 → 계속 100만큼의 용량을 점유
- VARCHAR(100)dp ‘abc’가 들어가는 경우 → 길이를 3으로 줄이므로 그만큼 용량을 줄인다.
- resize 과정이 포함되기 때문에 insert 시간이 늘어난다.(20퍼센트 정도 느려진다고함)
- 주민번호, 전화번호 등 길이의 편차가 작은 문자열에는 CHAR
- 이름, 주소, 게시글 제목/내용 등 길이의 편차가 큰 문자열에는 VARCHAR
- CHAR의 max length는 255, VARCHAR의 max length는 65535
- CHAR(256) 이상을 쓰고싶다면?
- 어쩔 수 없지만 VARCHAR를 사용해야함
- VARCHAR(16) 이나 VARCHAR(9999)나 똑같다?
- 길이가 2인 문자열만 넣는다? → resize되므로 insert된 row가 차지하는 용량에는 차이가 없다.
- LENGTH 함수에 넘겨지거나 값 비교를 하거나 할 때 max length에 해당하는 메모리를 준비
- VARCHAR(16)은 1바이트의 정수를 준비
- VACHAR(9999)는 2바이트의 정수 준비
- 때문에 max length가 클수록 메모리를 더 많이 사용할 수 있음(눈에 띄는 정도는 아님)
- max length가 큰 문자열은 index로 사용되엇을 때 문제를 일으킬 수 있음
- 사이즈가 커서 index로 등록이 불가능하거나
- INSERT/UPDATE/DELETE 퍼포먼스가 크게 저하되거나
- index는 데이터를 순차적으로 저장할 수 있또록, 데이터에 변동이 생길 때마다 정렬을 수행한다.
- 정렬을 위해 데이터를 비교할텐데, 길이가 길면 그만큼 비교가 오래걸린다.
- 가능한 작게 준비하자.
- TEXT 타입들
- TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
- resize를 수행함
- 제약이 좀 있다.
- 최대 길이를 제한할 수 없음
- 최적화 여지는 있다.
- INT도 동일하다. TEXT와 동일하다.
- 최대한 작은 타입