2010년 2월 25일 목요일

튜닝을 위한 팁(전체)

1. 쿼리와 테이블 구조
slow query log에 기록되는 쿼리를 수정한다. 또 인덱스도 적절하게 작성한다.
JOIN 이나 GROUP BY 등으로 임시 테이블을 사용하는 빈도를 낮춘다.

2. 쿼리 캐쉬 사용
같은 SELECT문이 실행된다면 효과가 기대된다.

3. 바이너리 로그 파일등은 별도의 디스크에 보존
I/O를 분산처리한다.

4. prealloc영역
한개의 스레드로 많은 쿼리를 처리해야하는 경우 사용할 수 있는 변수이다.
쿼리 해석등에 사용하는 메모리는 그 때마다 할당되고 해제되지만 prealloc변수는 미리 할당한 영역을 해제하지 않고 그 다음 처리에도 사용한다. prealloc변수에는 다음과 같은 것이 있다.
query_prealloc_size
transaction_prealloc_size

5. 메모리 처리량에 주의
sort_buffer_size , join_buffer_size, read_buffer_size, read_rnd_buffer_size 를 늘리면
쿼리의 처리가 빨라질 수 있지만 너무 많이 늘리게 되면 메모리가 부족하게 되므로 조심해야한다. ( 이것들은 스레드단위로 메모리가 할당된다. )

6. 스레드 캐쉬, Listen
접속이나 절단이 많은 경우는 thread_cache_size를 늘려서 재이용할 수 있는 스레드 수를 확보한다. MySQL은 접속이 있을 때마다 자식 스레드를 작성하고 절단할 때에 그 자식 스레드를 파기한다. 이것을 몇개정도는 파기하지 않고 새로운 접속에 준비에 둘까하는 것을 지정하는 것이 thread_cache_size이다. 또, back_log로 Listen의 수를 늘려두면 접속반응이 좋아진다.

7. 테이블 핸들러의 확보
동시접속수가 많은 경우, 한번에 사용할 수 있는 테이블 핸들러의 최대수를 table_cache 지정으로 늘린다. 모든 클라이언트가 사용할 정도의 테이블 수만큼 확보해두면 낫지않을지 싶다. 이것이 적을 경우 테이블 핸들러의 close, open이 증가한다. MySQL설정예에서는 1024, 2048등이 사용되고 있다.