본문 바로가기

데이터베이스(DA, AA, TA)/MySQL

[MySQL] MySQL 사용시 하지 말아야 할 13가지

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% 정도 빠르다. 데이터 입력이 많다면 더 커질 수 있음.)



슬로우 쿼리 로그 남기는 방법 ( http://deadfile.tistory.com/entry/MySQLMariaDB-slow-query-log-%EC%84%A4%EC%A0%95%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%8A%90%EB%A6%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%B6%84%EC%84%9D-%EB%B0%A9%EB%B2%95 )