21382888

‘데이터베이스를 지탱하는 기술’이라는 책을 읽었다. 데이터베이스를 사용/운영하는 사람들이 알아두면 좋을 만한 내용들이 매우 많다. 후반부는 깊이가 상당해서 이해하는데 매우 어려움이 있다.

 

1. HDD의 경우 초당 랜덤 엑세스가 100~200회 밖에 되지 않는다. TPS가 1,000이 넘어가는 요청은 랜덤 엑세스로는 처리하기가 어렵다. MySQL InnoDB의 경우 Sequential write를 통해 초당 2,000회 정도의 Insert가 가능하다.

 

2. B+ Tree 인덱스를 사용하면 등호 검색은 물론 부등호나 전방 일치 검색 등의 범위 검색도 리프 블록을 스캔하는 것만으로 완결할 수 있다.

하지만 B+ Tree 인덱스의 약점은 모든 엑세스가 랜덤 엑세스라는 점인다. 인덱스가 메모리에 있는 상태면 매우 빠르게 동작하지만, 그게 아닌 경우에는 HDD로의 랜덤 엑세스가 발생되기 때문에 성능 저하가 크게 발생한다.

 

3. MySQL은 인덱스의 재편성이 완료될때까지 참조/갱신 처리를 차단시키는데 이는 병렬 처리 성능을 현저하게 떨어트린다. 이를 해결하는 가장 빠른 방법은 MySQL(InnoDB)의 파티션 테이블을 사용하는 것이다.

파티션 테이블 : 사용자에게는 테이블이 한개로 보이지만 내부적으로는 분할 관리하는 것이다. 이때 인덱스도 분할 관리되기때문에 병렬 갱신이 가능하다. 일반적으로 Range partition을 많이 사용한다.

 

4. Explain으로 Query의 성능을 검증할 수 있다.

http://dev.mysql.com/doc/refman/5.0/en/explain.html

 

5. MySQL의 경우 마스터는 RAID 구성의 HDD를 사용하여 다중 스레드로 병렬 엑세스하고, 슬레이브는 SATA SSD를 사용하여 단일 스레드에서도 충분한 성능이 나오도록 하는 식으로 활용하는 것이 모범 사례로 되어있다.

 

6. NoSQL의 현재 사용 용도는 RDBMS의 캐시 또는 세션 데이터, RDBMS와 NoSQL의 하이브리드 구성 (MySQLCluster NDB)로써 많이 사용되고 있다.

 

7. CPU나 메모리 상에서 처리를 완료하는 시간은 Micro seconds 수준 밖에 되지 않기 때문에 Millisecond 단위의 시간이 걸리는 디스크 I/O와 비교하면 무시할 수 있는 범위라고 할 수 있다. 따라서 데이터베이스의 속도라고 하면, “어떻게 디스크 I/O 횟수를 줄일 수 있는가?”라는 점이 포인트가 된다.

그런데 SSD등의 등장으로 디스크 I/O 오버헤드가 상대적으로 0에 가까워지면서 Millisecond 단위의 처리가 거의 없어지고 Micro second 단위가 새로운 병목으로 떠오르고 있다.

-> 즉, 기존에는 SQL 구문을 해석하고, 실행 계획을 생성하고, 테이블을 열고 닫는 등의 작업이 오버헤드가 아니였는데, 디스크 I/O에서 오버헤드가 많이 사라짐에 따라 이 부분이 병목으로 떠오르고 있다.