'analyze table'에 해당되는 글 1건

  1. mysql5.5.6 테이블 데이타 통계 자동 갱신 off 하기

mysql5.5.6 테이블 데이타 통계 자동 갱신 off 하기

잘 실행 되던 쿼리가 갑자기 느려 지는 경우가 있다.
또, 여러 조건에 따라서 정렬이 바뀌는 이상한 현상도 발행하는 경우가 있다.

모두, 통계값에 때문에 발행하는 문제라고 한다.
통계값에 따라서 쿼리 옵티마지져가 다르게 계산해 인덱스를 다르게 타는 현상때문에 그렇다고 한다.

그럼, 이런 현상을 막고 일관되게 쿼리가 실행되게 하려면 어떻게 해야 할까?
통계값이 자주 변경되면서 쿼리 실행 계획인 달라 진다면, 통계값을 어느정도 일관되게 유지 하면 된다.

자 통계값을 관리하는 방법을 알아보자.

현재, 운영중인 mysql서버는 5.5.6 버젼이다.
이 버젼에서는 innodb_stats_on_metadata 라는 설정값이 있고,
이 설정은 통계를 업데이트 하는 갱신하는 방법을 지정하는 설정이다.
값이 ON 이면 show table status, show index, analyze table 등으로 통계가 갱신이 된다.
심하게는 heidsql 에서 테이블 정보를 보는 과정에서도 갱신이 되기도 한다고 한다.

이렇게 자주 갱신되다 보면, 쿼리 실행 계획이 자주 변경되 일관된 실행계획을 유지하기가 어려운 경우가 발생하기도 한다.

이 설정을 OFF 로 하게 되면,
단순 조회만으로 통계를 갱신하지 않게 되어 일관된 실행 계획 유지가 가능하다.
이 경우 자동 갱신은 테이블 데이타의 1/16(6.25%) 이상 변경 되면 내부적으로 자동 갱신 된다고 한다.
수동으로 할 때는 analyze table 로 하면 된다.

이 마져도 메모리에 통계 정보가 저장되기 때문에 mysql 재시작 하게 되면 통계를 재 수집하게 된다.


mysql5.6 이상 버젼에서는,
innodb_stats_persistent = ON 을 통해서 메모리가 아닌, 시스템 테이블에 영구 보존이 가능해
서버 재시작시에도 갱신으로 인한 부하가 발생되지 않는다고 한다.


어쨋든, 나는 mysql 5.5.6을 사용하니
SET GLOBAL innodb_stats_on_metadata = OFF;
하고, 필요시 테이블 마다
ANALYZE TABLE 테이블명
하는 방식으로 해야겠다