커버링 인덱스(Covering Index)를 사용하라.
- http://gywn.net/2012/04/mysql-covering-index/
성능을 죽이는 잘못된 쿼리 습관.
-http://gywn.net/2012/05/mysql-bad-sql-type/
최적화를 위한 팁
- http://gywn.net/2012/09/mysql-tuning/
작을수록 좋다.
- 작은 데이터타입
단순한게 최고다
- 비용 : 정수 < 문자 < 문자셋 < 콜레이션
- 날짜와 시간은 Mysql 내장형식으로 저장
- IP주소는 정수를 이용해서 저장
가능하면 NULL을 쓰지 말자
- 컬럼은 되도록이면 NOT NULL으로 정의하자. NULL로 인해 인덱스,인덱스 통계,값 비교등이 더 복잡해지기 떄문이다.
- DATETIME과 TIMESTAMP는 같은 종류의 데이터를 저장하지만 TIMESTAMP는 저장 공간을 DATETIME보다 절반 밖에 사용하지 않고 서버측 시간대를 사용하며 자동업데이트라는 특별한 기능이 있다. 반면 허용되는 값의 범위가 훨씬 작고 때로는 특수한 기능이 약점이 되기도 한다
정수 타입
- TINYINT(8),SMALLINT(16),MEDIUMINT(24),INT(32),BIGINT(64) 을 사용하고 용도에 따라 UNSIGNED를 잘 활용하자.
- MYSQL에서는 INT(11)과 같이 정수 타입의 '길이'를 명시할 수 있다. 하지만 이 기능은 값의 유효범위를 제한하진 않고, MySQL 클라이언트(WORK BENCH)같은 프로그램의 화면 출력용으로 예약하는 문자의 개수를 지정할 뿐이므로 별다른 의미는 없다.
실수 타입
- 실수부는 소수부가 있는 숫자 이지만 BIGINT로 편현할 수 없을 만큼 큰 정수도 DECIMAL같은 실수 타입을 사용 한다.
문자열 타입
(스토리지마다 다르지만 여기에서는 InnoDB,MyISAM을 사용한다고 가정)
VARCHAR
- 가변길이의 문자열을 저장하는 타입
- ROW_FORMAT = FIXED 옵션으로 길이 고정 가능
- 값의 길이를 기록하기 위해 추가로 1~2바이트 사용
(문자열 : 1~255 byte -> 길이값 : 1byte )
- 공간을 절약하므로 성능이 도움이 된다.
길이가 가변이므로 행을 업데이트할 때 행의 길이가 길어지기도 하며, 이 때문에 추가적인 작업이 필요할 수도 있다.
- UTF - 8 처럼 문자마다 사용하는 바이트 수가 다른 복잡한 문자 셋을 사용할 때 큰가치가 발휘
CHAR
- 고정길이 문자열
- 뒤에 붙는 공백을 제거한다.
- MD5와 같이 길이가 언제나 같을 경우 사용
BINARY,VARBINARY
- CHAR,VARCHAR와 비슷하지만 바이너리 문자열을 저장한다.
BLOB,TEXT
-커다란 바이너리 문자열을 저장하려고 고안된 데이터 타입.
- 다른 데이터 타입과 달리 BLOB와 TEXT는 값을 스스로 정체성을 가진 객체로 취급한다.
- 인덱스를 사용하지 못한다.
날짜 및 시간 타입
DATETIME
- 8 Byte
- 1001년 ~ 9999년, 1초단위 저장 가능
- YYYYMMDDHHMMSS 포맷의 정수 값으로 묶는다.
- 시간대의 영향을 받지 않는다
- ANSI 표준 방식
TIMESTAMP
- 4 Byte
- 1970년 1월 1일 자정(그리니치 평균시)을 기준으로 몇초가 지났는지를 저장.
- 1970년 ~ 2038년 사이의 값만 저장 가능
- 시간대의 영향을