2009년 4월 30일 목요일

InnoDB의 버퍼2

#Insert buffer

Insert할 때에 변경해야하는 인덱스 페이지가 버퍼풀안에 없으면 인덱스에 넣는 레코드를 insert buffer에 넣어둔다. 
그리고, secondary index와 insert buffer내용을 merge하고 secondary index를 갱신한다. 

secondary index는 유일키가 아닌 경우가 많아서 insert할 때  secondary index변경을 빈번하게 수행한다는 것은 부하를 주기 십상이다. 
그것을 피하기 위한 조치이지만  반대로 검색할 때에는 Insert Buffer도 검색대상이 되는 경우도 있다.

merge는 insert트랜잭션이 commit된 후에 발생한다.   mysql 서버의 shutdown, 재기동시에도 발생한다.   merge할 때에는 디스크 액세스가 증가한다. 

#innodb log buffer
Innodb 트랜잭션로그를 잔류시켜놓는 버퍼이다. 
한개의 mysql서버당 한개의 버퍼가 할당된다.  
commit할 때에 로그 파일에 flush된다. 

innodb_flush_log_at_trx_commit옵션에 따라서 flush하는 간격을 지정가능하다. 

  • innodb_log_buffer_size  InnoDB 로그 버퍼사이즈
  • innodb_flush_log_at_trx_commit  0:1초간격으로 flush, 1: commit할  때 flush, 2: commit할 때 디스크 저장 그리고 1초간격으로 flush
innodb_flush_log_at_trx_commit는 2>1>0순으로 안전성이 뛰어나다. 
innodb_log_buffer_size의 상한값은 5.1.12-beta에서는 8M이다.(표준 1MB)

#innodb_additional_mem_pool_size
데이터 사전등의 InnoDB내부정보를 보존하는 버퍼이다. 
이 영역이 부족하게 되면 OS로부터 메모리를 확보하려고 한다. 
테이블이 늘어나면 그만큼 이 영역이 필요하게 된다. 

 20M정도 있으면 괜찮다고 한다.