MySQL 쓰면서 하지 말아야 할 것 17가지 ( https://blog.lael.be/post/370 )
1. 작게 생각하기
(MySQL ecosystem, 캐싱 사용, 확장 가능한 아키텍처, 복제/파티셔닝 고려)
2. EXPLAIN 실행계획 안보기
3. 잘못된 데이터 타입 선택
4. 스토리지 엔진 이해없이 사용
(단일 엔진으로 전체 아키텍처를 결정했다면 대부분 최적이 아님 / 엔진별 장단점 공부 필수)
5. 인덱스 레이아웃 이해없이 사용
6. 쿼리 캐시에 대한 이해없이 사용
7. Stored Procedure를 무분별한 사용
(다른 RDBMS와 다르게 connection thread에서 실행 계획이 세워짐
- ETL 타입 프로시저
- 아주아주 복잡하지만 자주 실행되지 않는 것
- 한번 요청할 때마다 여러번 실행되는 간단한 것
에 대해서만 프로세저를 사용)
8. 인덱스를 안쓰거나 쓸모없는 인덱스를 생성
(인덱스 분포도 (S=d/n) d=서로 다른 값의 수, n=테이블의 전체 레코드 수 가 낮으면 미사용 /
FK는 인덱스를 거는 것이 좋음, 자주쓰이는 where, group by 표현식에서 쓰이는 컬럼은 인덱스 고려
covering index에 대한 조사)
9. join 미사용
(서브쿼리는 join으로 재작성, 좋은 MySQL 성능을 내려면 기본 / 루프가 아닌 집합 기반으로 생각)
10. Deep Scan 고려하지 않는 것
11. 프로파일링이나 벤치마킹 미사용
(프로파일링: 병목 찾아내기, 벤치마킹: 시간에 따른 성능 변화 추이 평가, 부하 테스트
느린 쿼리에 대해서는 로그 남기기: * log_slow_queries=/path/to/log * log_queries_not_using_indexes )
EXPLAIN, SHOW PROFILE, MyTop/innotop, mysqlslap, MyBench, ApacheBench (ab), super-smack, SysBench, JMeter/Ant, Slow Query Log
12. AUTO_INCREMENT 미사용
(고속 병행 INSERT 가능
LOCK없이 사용 가능: 새 레코드 근처에 놓음으로써 디스크와 페이지 단편화를 감소)
13. ON DUPLICATE KEY UPDATE 미사용
(exists 추가 코드가 필요없음. 5-6% 정도 빠르다. 데이터 입력이 많다면 더 커질 수 있음.)
'데이터베이스(DA, AA, TA) > MySQL' 카테고리의 다른 글
[MySQL] 쿼리 실행 구조 및 쿼리 캐시 (0) | 2017.04.28 |
---|---|
[Real MySQL] MySQL 아키텍처 (0) | 2017.04.28 |
[MySQL] 프로시저(스토어드 프로그램)의 장단점 (0) | 2017.04.25 |
[MySQL] MySQL 파티션 제약사항 (0) | 2017.04.25 |
[Real MySQL] MySQL 파티션 개요 (3) | 2017.04.21 |