본문 바로가기
IT라이프/Database

MySQL 퍼포먼스 향상 (2) 스키마 최적화

by zairan 2015. 6. 20.

2. 스키마 최적화, 그리고 인덱스


데이터형 지정 관련

  - 데이터형은 사용가능한 가장작은 형을 사용해야 한다.

  - 문자보다는 숫자같이 단순한 형이 좋다.

  - 필드는 NOT NULL 로 지정하고 디폴트 값을 넣자. NULL 로 지정하면 MySQL 내부에서 처리를 해야하고 인덱스 붙이기에도 적절하지 않다.


날짜 관련

  - DATETIME, TIMESTAMP 의 차이. TIMESTAMP 는 반의 용량을 사용하며, 타임존에도 대응한다.


숫자형 관련

  - 정수형도 좀더 세분하게 나눠서 정의하자. 무조건 INT 는 피하자

  - 정수계산은 32 비트 아키텍처라 하도 64비트로 계산된다.

  - double, float, decimal 같은 실수형. decimal 은 소수점 계산이 가장 정확하다. 돈 계산같은 정확한 계산에 필요함

  - double, float 은 물론 decimal 형보다는 사이즈가 작다. 


문자열 관련

  - VARCHAR 와 가변형이기 때문에 필요한 만큼 사용한다. MyISAM ROW_FORMAT=FIXED 에서는 일정 사이즈 사용할수 있으니 주의

  - VARCHAR 가 가변형이어도 일단 데이터의 길이를 기억하는 공간이 필요한데, 255 까지는 1 바이트 , 256 부터 2 바이트를 사용한다.

  - VARCHAR 는 기억영역의 절약에는 도움이 되지만, 갱신시에는 크게 될 가능성도 있다.

  - CHAR 는 매우 짧은 문자열을 저장할 때만 사용하자. 문자열의 길이가 늘어날 일이 없는 경우가 좋다

  - CHAR 는 데이터 단편화가 발생하기 어렵다. 빈번히 변화하는 데이터에 VARCHAR 가 좋다.


바이너리 문자열 관련

  - 바이너리 문자열은 BINARY, VARBINARY 가 있음. 

  - 바이너리 문자열과 문자열의 차이점은 문자대신 바이트를 이용한다. 그러므로 바이트 단위로 비교해야 할때, 좋다. 대소문자 구분도 없다. 바이너리 문자열을 1 바이트씩 수치로써 비교하기 때문에 문자열 비교보다 단순하여 고속 비교가 가능하다.

  - 대용량 바이너리 BLOB , 대용량 문자열 TEXT 형들이 존재한다.

  - BLOB, TEXT 형의 값을 자체 ID 를 부여하여 오브젝트로서 관리한다.

  - BLOB, TEXT 데이터는 문자열전체에서 소트하는 것이 아닌, 최초 max_sort_length 만을 소트시킨다. 변경하고 싶은 경우에 max_sort_length 를 조정하거나, ORDER BY SUBSTRING 을 이용하자.

  - 바이너리, TEXT 에는 인덱스를 지정할 수 없다.


ENUM 관련

  - ENUM 형은 65535 개까지 저장가능한 문자열. 매우 컴팩트하다.

  - ENUM 소트는 문자열이 아닌 내부 숫자로 실행된다. FILED 함수를 사용하여 소트의 순서를 지정할 수 도 있으나 이 경우 인덱스 사용불가

  - ENUM 은 문자열 리스트가 고정이며, 문자열의 추가삭제에는 ALTER TABLE 을 사용해야만 한다.

  - ENUM 은 정수형으로 저장되어짐. 날짜, 시간 저장에는 비추천.


날짜시간 관련

  - DATETIME 은 타임존에 관계없이 YYYYMMDDHHMMSS 의 정수가 들어간다. 8 바이트 사용.

  - TIMESTAMP 는 유닉스 타임스탬프와 동일. 4 바이트 사용.

  - TIMESTAMP 는 디폴트로 NOT NULL 현재시각이 입력된다.

  - TIMESTAMP 는 DATETIME 보다 스토리지 효율이 좋아서 매우 추천.


식별자 관련

  - MySQL 에서 BIT 는 문자열이다. 바이너리 0 또는 1 로 저장되어 있다가 결과는 문자열로 변환되어 나타내므로 비추천

  - 식별자는 정수형이 빠르게 처리되며 AUTO INCREMENT 에도 대응된다.

  - ENUM, SET 은 상태플래그, 카테고리 등으로 사용하기에 적합하다.

  - 문자열을 식별자로 사용하면, MyISAM 에서 인덱스 지정시 퍼포먼스가 나빠진다. 문자열은 식별자 사용에 적합하지 않다.



반응형

'IT라이프 > Database' 카테고리의 다른 글

Master data vs Transaction data  (0) 2022.10.05
MySQL 퍼포먼스 향상 (4) 정규화  (0) 2015.06.20
MySQL 퍼포먼스 향상 (3) 인덱스  (0) 2015.06.20
MySQL 퍼포먼스 향상 (1) 아키텍처  (0) 2015.06.20
mysql 날짜별 조회  (0) 2013.09.30

댓글