jc01rho의 일상잡다

[DBMS] MySQL 의 InnoDB 엔진 의 특성 본문

컴퓨터/PHP & MYSQL & 웹

[DBMS] MySQL 의 InnoDB 엔진 의 특성

jc01rho 2012. 6. 4. 03:50
다들 한번씩은 들어봄직한 InnoDB 엔진에는 개발시 매우 중요한 부분을 차지할 수도 있을 만한 특성이 있습니다.

이 특성 3가지를 언급해 보고자 합니다. 행여 InnoDB 를 사용하여 개발하시는 분들은 참고하시길 바랍니다.


1. 트랜잭션을 유일하게 지원하는 엔진입니다.
뭐 다 아시는 내용이라 생각합니다. 이것을 위해서는 행 단위 락을 지원하게 됩니다.
이에 대한 내용은 생략하도록 하겠습니다.

2. 저장되는 데이타는 무조건 Primary Key (PK) 의 순서대로 정렬해서 저장됩니다.
이 얘기는 테이블 생성시 PK 의 선택에 매우 중요한 사항이 됩니다.

예를 하나 들어볼께요

10, 20, 30, 40, 50 이런 데이타가 순서대로 디스크에 저장이 되어 있습니다.
만일 여기서 15 라는 PK 값(데이타) 가 추가로 insert 된다고 생각하시면요
MyISAM 같은 경우라면
10 20 30 40 50 15 라고 저장되는지는 모르겠으나,
이 InnoDB 에서는 이렇게 저장됩니다

10 15 20 30 40 50
이 말이 무슨말인고 하니 20 그 이후 데이타가 물리적으로 뒤로 쭈욱 밀리게 됩니다.
(디스크에 새로 기록합니다.)

이제 왜 중요한지 아시겠지요? 데이타수가 엄청나게 많은 데용량이라면
중간에 키가 삽입이 되면 정렬을 위해 데이타를 그 이후부터 전부 새로 기록하기 때문에
심각한 문제를 초례할 수도 있습니다. (데이타 하나 혼자서 insert 하는데 엄청난 시간이 소요될 수 있습니다.) 심각한 I/O 가 발생할 수 있다는 것이죠. 한마디로 헐~ 입니다.

PK 값은 유니크해야 하기 때문에 주로 자동증가를 사용하겠지만
멀티컬럼으로 잡을수도 있고 랜덤값으로 이용할 수도 있습니다.

그럼 여기서 만일 PK 를 지정하지 않고 테이블을 만들면 어떻게 될까요?
한마디로 말하면 내부적으로 강제로 PK 를 만듭니다. (왜 만드는지는 다음 특성을 보시면 이해됩니다.)

테이블 내에 유니크컬럼이 존재하면 그것을 기반으로 PK 로 잡습니다.
(다시 한번더 말씀드리지만 PK 로 잡힌다는 의미는 그것을 인덱스 정렬하여 디스크에 정렬하여 기록한다는 -클러스터- 것을 의미합니다.)

그럼 유니크도 없다면? 내부적으로 6Byte 짜리 PK 값을 생성하여 사용한다고 합니다.
이때는 만일 데이타상에 NULL 값이 존재하는게 있으면, 위험해질 수도 있씁니다.
리플리케이션이나 이런 쪽에서도 문제가 생깁니다.

결론은 PK 를 만들건 안 만들건 간에 InnoDB 에서는 PK 를 무조건 가지게 된다는 것이고
이 PK 를 순서대로 정렬하여 데이타가 물리적으로 기록된다는 것입니다.

이런 PK 의 문제를 해결하기 위해서 그냥 MyISAM 을 상요한다??
이건 뭐라 말하기 힘드네요.. InnoDB 를 선택했다 함은 트랜잭션을 위함일텐데 그것을 버린다는건 말이 안 된다는 생각입니다.


3. PK 를 제외한 모든 인덱스의 키에는 PK 의 키값을 value 로 함께 가지면서 인덱스를 생성합니다.
이 문제때문에 내부적으로 무조건 PK 를 가지게 됩니다.

이 말인즉,

pk data: 10 20 30 40 50
idx col dat: 1 3 5 2 4

와 같이 있다면 저장되는 idx 컬럼의 인덱스 파일에는 이렇게 저장됩나다.

1,10 2,40 3,20 4,50 5,30
이런 데이타가 저장이 됩니다. 콤마는 그냥 쌍이라는 의미로 보세요 키값과 벨류의 쌍

만일 단일 PK 가 아니고 멀티PK 라면
해당 멀티PK 값 (2컬럼 멀티라면 2개의 컬럼값) 이 쌍으로 함께 붙습니다.

이렇게 때문에 상황에 따라선 인덱스 파일이 실제 테이블 파일보다 용량이 더 커질 수도 있습니다.
또한 필요에 의해 인덱스를 생성하겠지만, 너무 많은 인덱스는 오히려 성능이 떨어질 수도 있습니다.

또 중요한 사실은 PK 값이 변경이 되면 PK 인덱스도 변경이 되지만 (데이타파일이 제정렬되어 기록)
해당 테이블 내에 있는 생성된 모든 인덱스에도 영향을 미칩니다. (인덱스 파일을 갱신합니다.)
그러므로 PK 의 선택은 매우매우 중요하며, 왠만해선 값을 변경하지 말아야 합니다.


이 내용은 데이타가 몇개 없다면 별 의미없겠지만
데이타가 많으면 많을수록 중요한 부분을 차지하게 될지도 모르므로
사용상 주의를 요합니다.


========= 추가 =========
본 게시물은 아래의 링크를 참고로 작성되었습니다.
출저가 생각나지 않아 미쳐 언급을 못했네요.
http://dev.paran.com/2011/06/10/mysql-innodb-engine-3-tips-you-must-know/

 

'컴퓨터 > PHP & MYSQL & 웹 ' 카테고리의 다른 글

[MySQL] innoDB INSERT 속도 향상 방법  (0) 2012.06.04
MYSQL 테이블 최적화검사  (0) 2012.06.01
주소창의 순수한글 그대로받아쓰기  (0) 2012.02.17
Eclipse with PHP  (0) 2011.07.05
Comments