어떤 DBMS이든지 마찬가지겠지만, DBMS를 효율적으로 적은 리소스로 가장 좋은 성능을 내게끔 사용하기 위해서 가장 먼저 해야 하는 일은 어떠한 구조로 만들어 졌는지 확인하는 것이다. DBMS의 특성을 확인하여, 그 DBMS의 장점과 단점을 파악하고, 내가 원하는 서비스의 성격에 맞게 DBMS를 선택하여 사용하면, 훨씬 더 효율적으로 데이터를 관리 할 수 있다.

MySQL도 DBMS로서 다른 DBMS와 비교되는 구조와 특성을 가지고 있다. 이러한 특성을 미리 나열하기 전에 MySQL의 내부 구조에 대해 먼저 알아보자.

 

[그림 1-1]

[그림 1-1]은 MySQL Conference에서 MySQL 내부 구조 설명시 MySQLAB에서 사용했던 그림이다. 여기에서 알수 있는 것은 MySQL Server의 내부의 모듈들은 컴포넌트 형태로 되어있어서 여러 기능들이 퍼즐 형식으로 엮여져 있다는 것이다.

퍼즐 형태로 만들어진 내부 모듈들로 인해 내부적으로 다른 스토리지 엔진을 추가하거나, 기능을 추가할때, 다른 모듈에 크게 영향을 주거나 하는 일이 적은 것을 확인할 수 있다.

맨 위의 오른쪽에 표시된 SQL Control interface는 MySQL Client와 MySQL Server 사이에 존재하는 Interface로서 백업을 진행할 때나, 상태 정보를 보고 싶을때와 같은 경우에 컨트롤 하는 문장들을 의미한다.

사용자 삽입 이미지

 

[그림 1-2]
[그림 1-2] 도 MySQLAB에서 MySQL Server와 Application과의 관계및 여러 Tool들을 설명하기 위해 사용하는 그림 중의 하나이다.

크게 MySQL은 세 단계로 나누어 생각할 수 있다. 첫번째는 위의 그림에서 Connector로서 표현한 Client 부분, 두번째는 MySQL Server의 머리부분에 해당하는 부분으로 SQL을 분석하여 실행계획을 만드는 부분, 세번째는 데이터를 저장하고 추출하는 Storage Engine 부분이다.

맨 위의 Connector는 MySQL Server에 접근하기 위해 Application에서 설치하여 사용할 수 있는 모듈들을 나타낸다. C API, JDBC등 언어에 따라 여러가지 Connector들을 사용할 수 있고, 이 Connector들을 사용하여 MySQL Server와 통신할 수 있다.

두번째 부분는 MySQL의 인스턴스 부분으로 Client로 부터 들어온 쿼리를 분석하고 최적화 하여 실행계획을 만들고, 필요할 경우 메모리에 cache하는 기능을 담당하는 부분이다.

세번째 부분은 Storage Engine 영역으로 데이터를 저장하고, 추출하는 부분을 담당하는 부분으로 나눌 수 있다. 위의 그림에서 보는 것과 같이 스토리지 엔진의 종류는 다양하다. MySQLAB에서 만든 스토리지 엔진도 있고, 다른 서드파티에서 만든 스토리지 엔진도 있다. 화면에 보이는 스토리지 엔진은 대부분 MySQLAB에서 만든 것들이다.

각각의 스토리지 엔진은 그 데이터 저장방법 및 추출 방법에 장점과 단점을 가지고 있다. 그렇기 때문에 실제 서비스에 사용할 때에는 스토리지 엔진 특성에 맞게 취사 선택을 잘 해야 한다.

실제 한국에서 웹 서비스에 많이 사용하는 스토리지 엔진은 MyISAM과 InnoDB이다. 그러므로 추후에 강좌에서는 MyISAM과 InnoDB에 대해 자세히 다루도록 할 예정이다.

[그림 1-2]의 MySQL Server 부분에 표현된 SQL 분석 부분에 관련된 부분을 자세히 살펴보도록 하자.

먼저 Connection Pool은 MySQL 내부에서 관리하는 Connection Pool을 말하는 것으로 새로운 유저의 커넥션 쓰레드를 DB에 할당하여 저장하는 부분을 말한다. Connection을 생성하게 되면 자동적으로 그 Connection에서 실행할 SQL 작업을 위한 메모리가 자동적으로 할당된다.

SQL Interface는 DML, DDL, Stored Procedure, View, Cursor, Trigger등의 지원을 위한 Interface부분을 말하고, 모든 SQL 함수에 대한 지원을 제공하는 모듈을 말한다.

Parser/Optimizer는 SQL의 권한을 확인하고, SQL문을 데이터베이스 내부 언어로 변환하고, 수행 경로를 분석하는 등 SQL문을 실행을 위한 준비 작업을 하는 부분을 말한다. 이 부분은 모든 스토리지 엔진에 동일하게 적용되기 때문에 스토리지 별로 별도의 코딩이 필요없다.

메모리 캐쉬 부분은 빈번하게 사용되는 인덱스나 데이터를 빠르게 접근하게 하기 위해 메모리에 저장하는 영역을 말하며, 스토리지 엔진에 따라 그 기능은 조금씩 차이가 난다.

 




Posted by 모모레

댓글을 달아 주세요

  1. itcon 2011.12.15 10:02  댓글주소  수정/삭제  댓글쓰기

    MySQL 구조도가 아주 멋져요~!

  2. BlogIcon 모모레 2012.01.03 10:24 신고  댓글주소  수정/삭제  댓글쓰기

    레퍼런스에 있는 그림이랍니다. ^^;

  3. retsamelcaro 2013.03.04 10:53  댓글주소  수정/삭제  댓글쓰기

    강좌 쓰시느라 고생하셨네요. 잘 봤습니다. 감사^^

  4. 초탁 2014.08.12 14:42  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다.
    오라클쪽만하다 MySQL 공부할일이 있어서 들렀는데 잘봅니다~ ^^

  5. 카르 2015.02.25 16:37  댓글주소  수정/삭제  댓글쓰기

    mysql구조에 대해 공부하고 있는데 좋은 자료인 것 같습니다.
    감사합니다~

    • BlogIcon 모모레 2015.02.26 18:58 신고  댓글주소  수정/삭제

      네~~ 고맙습니다. (^^)(__)
      근데 이문서는 5.1이라서요.
      5.6 Admin을 보시는게 ....^^;; 그게 새 버젼이니깐요~
      카테고리 보시면 5.6 버젼을 확인할 수 있습니다.

  6. BlogIcon Louis.Kim 2016.02.11 10:48 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다.
    저도 오라클만 공부하다가 mysql 로 넘어왔는데 많은 도움이 되었습니다.
    괜찮다면 담아 가겠습니다.
    혹시라도 문제가 된다면 알려주세요- 자삭하겠습니다.

  7. 알 수 없는 사용자 2016.07.08 18:40  댓글주소  수정/삭제  댓글쓰기

    좋은 자료 감사합니다. 잘 보고 있습니다.