리눅스 및 DB

MySQL 인덱스 관련참고

끄적끄적 2007. 5. 22. 14:43

요즘 MySQL DB replication을 구현하려고 개발장비에서 테스트를 하고 있다.

그런데, 개발 DB를 보다 보니 몇 개의 table의 index가 disable상태였다.

운영DB내용 dump받은 걸 넣은건데 몇몇 테이블만 인덱스가 disable이라니..이상하다;

어쨌든, MySQL의 인덱스는 아래 명령어로 disable, enable시킬수 있었다.
ALTER TABLE foo DISABLE KEYS;
ALTER TABLE foo ENABLE KEYS;

찾다보니 대용량 데이터를 insert할때 index를 disable해두면 속도가 빠르다고 한다.

MySQL은 인덱스 생성시 별도 테이블로 카피해서 rename하는 구조이기 때문에,
인덱스를 삭제 후 생성하는 것 보다, disable해두었다가 enable시키는게 좋겠다.

즉, 새로운 테이블 생성 -> 인덱스 disable -> 데이터 로드 -> 인덱스 enable을 이용하는
것이다. disable된 동안 변경된 데이터는 index에 반영이 안되다가 enable될 때 다시 정렬을 시키는 것으로 보인다.

혹시나 해서 기존 테이블에서 인덱스 생성, 삭제시에 disable시켜두면 속도가 좀 빠를까 해서 해봤는데 크게 차이는 없다..ㅎㅎ;
인덱스 disable상태에서 index drop이나 add를 하면 자동으로 enable되는 걸로 봐서 disable은 insert 등 작업시에만 유용할듯..

위의 내용과 함께 myisam_sort_buffer_size를 키워두고 인덱스 작업을 하면 속도가 좀 빨라진다. 작업시에만 조정해서 하면 유용하겠다.

아래 내용은 disable여부와 메모리사이즈 조정으로 테스트한 내용
(300만건데이터, 8개 컬럼, 인덱스 4개인 테이블을 이용)

1. 인덱스 enable, myisam_sort_buffer_size=64M
  1) 인덱스 drop(1 min 7.53 sec)
  2) 인덱스 add (1 min 13.43 sec)

2. 인덱스 disable, myisam_sort_buffer_size=64M
   1) 인덱스 drop (58.38 sec)
    2) 인덱스 add (1 min 13.32 sec)

3. 인덱스가 enable, myisam_sort_buffer_size=512M
   1) 인덱스 drop (54.76 sec)
    2) 인덱스 add (58.70 sec)

4. 인덱스가 disable, myisam_sort_buffer_size=512M
   1) 인덱스 drop (49.11 sec)
    2) 인덱스 add (58.50 sec)

반응형