2009년 9월 13일 일요일

테이블관리2- 관리SQL

ANALYZE TABLE

문법: ANALYZE [LOCAL| NO_WRITE_TO_BINLOG] TABLE 테이블명 [, 테이블명]
동작테이블: MyISAM, InnoDB
실행에 필요한 권한: SELECT && INSERT
myisamchk옵션: -a, -analyze
내용: ANALYZE TABLE은 테이블의 인덱스분포를 해석하고 그것을 기록한다.
ANALYZE을 MyISAM테이블에 적용시켰을 경우에는 read lock이 걸리고 InnoDB테이블에 적용시켰을 경우에는 write lock이 걸린다.
NO_WRITE_TO_BINLOG 키워드나 LOCAL키워드가 지정되지 않는 한 ANALYZE TABLE은 바이너리 로그에 기록된다.

사용예
mysql> ANALYZE TABLE tb1\G
*************************** 1. row ***************************
Table: test.tb1
Op: analyze
Msg_type: status
Msg_text: Table is already up to date
1 row in set (0.00 sec)

mysql> show index from tb1\G
*************************** 1. row ***************************
Table: tb1
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: user_id
Collation: A
Cardinality: 1
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:


1.InnoDB에서 ANALYZE TABLE

InnoDB경우 ANALYZE TABLE을 실행하면 SHOW INDEX에 표시되는 인덱스의 카디넬러티(cardinality :인덱스내 유일키의 수를 나타내는 항목)가 결정된다. 그러나 이것은 어디까지나 추정치로 각각의 인덱스 트리를 랜덤으로 조사해서 계산한다.
따라서 ANALYZE TABLE을 반복적으로 실행하면 다른 값이 나타날 수 있다.

2.JOIN과 ANALYZE TABLE

MySQL에서는 JOIN동작을 할때만 이 인덱스 카디넬러티값을 이용한다.
만약 JOIN할 때 확실히 최적화되어 있지 않다고 생각된다면 ANALYZE TABLE이나 OPTIMIZE TABLE을 실행하면 개선될지도 모른다.
그래도 해결되지 않는 경우는 FORCE INDEX구를 SQL문에 사용하는 방법도 있다.

JOIN할 때는 max_seek_for_key에 설정된 횟수이상은 키 스캔을 하지 않도록 옵티마이져에 알리지만 5.1.12-beta 표준치는 4294967295회이므로 보통은 키 스캔을 전부 수행하게된다.