포럼
innodb 와 myisam 에 대한 비교
2011.11.07 19:32
쉽게 설명을 해보도록 할게요.
innodb 와 myisam 은 뭐 트랜잭션을 지원한다던가 다양한 차이점이 있지만,
웹사이트 성능에 가장 큰 영향을 미치는건, locking 방식의 차이라고 할수있습니다.
locking 방식은
innodb 는 row 단위로,
myisam 은 table 단위로 처리하게 되지요.
아 이게 무슨소린지 잘 모르셔도 일단 저 두가지를 이해하고 다음으로 넘어가 주시길 바랍니다.
일단 먼저 왜 데이터베이스가 lock 이라는것을 수행하는지 이해하셔야 합니다.
예를들어서 A 에 10이라는 정보가 들어가있다고 합시다.
우리는 A 에 들어가있는 숫자를 연산을 통해서 2배로 만드는 프로그램을 가지고 있습니다.
근데 그 프로그램 연산하는데에는 무려 20초가 걸린다고 가정해봅시다.
그러면,
요구 -> A 가져옴 -> 20초 동안 처리 -> 원래값의 2배인 20을 A 에 넣음
의 순서를 가지게 됩니다.
근데 웹서비스(데이터베이스)는 같은 시간에 다양한 요구가 오는 상태가 매우 잦지요.
요구 A 도 A 를 2배로 만들고
요구 B 도 A 를 2배로 만든다고 해봅시다.
요구 A --> A 가져옴 --> 처 리 중 --------------------> 2배인 20을 넣음
이라고 할때
요구B -----> A 가져옴 --> 처 리 중 ----------------------------> ??
맨 마지막의 ?? 의 결과값은 몇이 될까요?
원래라면 두번 처리되었으므로, 40이 들어가야 맞지만,
요구 B 가 A 를 가져오는순간에는 여전히 10이므로,
최종값은 20이 됩니다.
이렇게 되면, 난리가 벌어지겠지요?
은행에서 계좌이체를 연타하면 계좌 돈은 한번만 빠져나갔는데 입금은 여러번 되는 돈복사 버그가 벌어질지도 모릅니다.
이러한 것을 막기 위해서 데이터베이스는 lock 이라는걸 지원합니다.
요구 A 가 모든 처리를 끝낼때까지 다른 사람은 A 를 건들지 못하게 하는거죠.
요구 A --> A 가져옴 --> 처 리 중 --------------------> 2배인 20을 넣음
요구B -----> A 가져옴 --> 처 리 중 --------------------------> ??
가
요구 A --> A 가져옴 --> 처 리 중 ----------> 2배인 20을 넣음
요구B -----> 대기 -----------------------------> A 가져옴 - > 처리 -> 2배인 40을 넣음
을 되게 만드는거지요.
자, 그럼 이게 어떠한 차이를 유발하느냐.
조금더 이야기를 해봅시다.
myisam 의 경우
table 단위로 이러한 lock 을 처리합니다.
xe_documents 라는 XE 문서 전체 테이블 단위로 lock 을 거는거죠.
A 라는 사람이 글을 수정하는 동안에는
B 는 글을 수정할수가 없습니다.
그것이 설사 다른 글이라고 해도 말이죠.
A 가 documents 테이블에서 행동을 하는동안은
documents 테이블에 관련된 모든 요구가 대기상태에 빠집니다.
!!!
innodb 의 경우는 DB 의 row 단위로 lock 을 처리합니다.
myisam 과는 다르게
글 번호 100번을 건들고 있다면
101번은 동시에 건들수 있는거죠.
오오! 동시 작업 능력이 훨씬 나아지고,
대기시간이 나아지는 좋은거군요!
라고 생각할수 있는데,
이 방식도 단점이 존재합니다.
lock 을 처리해야할 양이 많아져서
그러한 처리양이 부담이 되는거지요.
테이블 단위라면 테이블 30개 정도의 lock 만 관리하면되는데
리플이 300만개라면 300만개의 lock 를 관리해야겠지요
다만 그러한 관리의 부담을 고려하고서라도,
테이블 단위의 락은 테이블에 데이터가 많이 들어가고, 그 데이터에 많은 사람이 접근하는경우는 지연 시간이 기하급수적으로 늘어납니다.
그러한 의미에서 대규모 접속이 많은 사이트의 경우는 innodb 를 추천하는거지요
'-^