본문 바로가기
MYSQL / R

MERGE 형식의 테이블

본문

MERGE 형식의 테이블은 MRG_MyISAM 테이블이라고도 한다.
모아 사용할 모든 테이블은 동일한 컬럼을 가지며 key 정보를 가지고 있는 필요한 몇 개의 MyISAM 테이블을 모아서 만든 테이블이 MERGE 테이블이며, MyISAM 테이블처럼 사용 할 수 있다.
그러므로 오직 select, delete, update만 테이블 집합인 MERGE 테이블에서 수 행할 수 있다.
MERGE 테이블을 drop하더라도 원래의 테이블의 데이터는 그대로 있고 오직 MERGE 테이블 데이터만 drop된다.
또한 DELETE FROM merge_table처럼 where 조건 없이 실행하면 해당 테이블의 모든 데이터가 삭제된다.

컬럼이 서로 다르게 압축되었거나, 아주 동일한 컬럼을 가지고 있지 않거나, key 순서가 테이블마다 다르게 가질 경우에도 테이블들을 merge할 수 없다. 그러나 myisampack로 압축된 테이블은 merge할 수 있다.

MERGE 테이블을 만들면 테이블 정의 파일인 '.frm'과 테이블 목록 파일인 '.MRG'이 생기며, '.MRG' 파일에는 인덱스 파일 목록인 '.MYI'의 정보도 들어 있다. MERGE 테이블은 물론이고 MERGE 테이블에 모아 쓸 모든 테이블도 물론 같은 데이터베이스에 있어야 한다.

MERGE 테이블의 장점:
#&8226; 한 무리의 등록 테이블을 쉽게 관리한다.
• 속도가 빠르다.
• 효과적으로 탐색한다.
• 효과적으로 수리한다.
• 여러 파일을 하나의 파일처럼 순간적으로 매핑한다.
• 큰 테이블을 join하기 보다 MERGE 테이블로 하면 빠르고 디스크 공간을 절약한다.
• 운영체제상의 파일 크기 한계까지 사용할 수 있다.
• 하나의 테이블에 MERGE로 alias/synonym을 여러 개 붙일 수 있다.

MERGE 테이블의 단점:
 • 동일한 MyISAM 테이블에만 사용된다.
 • REPLACE 문을 사용할 수 없다.
 • MERGE 테이블은 file descriptor를 더 많이 사용한다. 예를 들어, 10개의 테이블을 매
    핑하여 만든 MERGE 테이블을 10명이 사용한다면, 10*10+10라고 하는 file descriptor가
    요구되는데 이는 (10개의 데이터파일) + (10명의 사용자) + (10개의 공유 인덱스  파일)
    이 필요하기 때문이다.
 • key를 읽는 것이 느리다. 그 이유는 key를 읽을 때 MERGE storage engine은 모든 해
    당 테이블에 대해서 key를 읽겠다고 한  다음, 주어진 key에 어느 것이 가장  근접하게
    매치되는지 체크하기 때문이다.
 • MERGE 테이블에 매핑된 해당 테이블이 'open'되어 있을 경우에는 DROP TABLE,  ALTER
    TABLE, where절 없는 DELETE FROM  tbl_name, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE
    TABLE, ANALYZE TABLE을 실행할 수 없다. MERGE 테이블이 원래의 테이블이 참조하고
    있는 중에 이러한 명령을 실행하면 예기치 못한 결과가  된다. 그러므로 이러한 문제를
    피하려면, FLUSH TABLES 명령을 실행하고 나서 하면 된다.

MERGE 테이블을 만들 때 UNION(list-of-tables)를 사용하여 만들어야 하는데, MERGE 테이블 들어가는 UNION 문의 첫 번째 테이블과 마지막 테이블은 INSERT_METHOD를 지정할 수도 있다. INSERT_METHOD를 지정하지 않거나 NO를 지정하지 않으면, MERGE 테이블 에 INSERT 문을 실행하면 에러메시지를 받게된다.
【예제】
mysql> CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE total (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20))
    ->  TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table  |
| 3 | t1      |
| 1 | Testing |
| 2 | table  |
| 3 | t2      |
+---+---------+
6 rows in set (0.00 sec)
mysql>

예제에서 컬럼 a는 PRIMARY KEY로 선언되었지만, UNIQUE하지 않은 것처럼 MERGE 테 이블은 MyISAM 테이블에서 데이터를 가져오기 때문에 UNIQUE를 강요할 수 없다.
MERGE 테이블을 re-map하려면 다음과 같은 방법중의 하나를 사용한다.

 방법1) MERGE 테이블을 DROP하고 MERGE 테이블을 다시 만든다.
 방법2) ALTER TABLE tbl_name UNION(...)을 사용한다.
 방법3) '.MRG' 파일을 변경하고 MERGE 테이블에 대해 FLUSH TABLE을 실행한다.

방법3의 쉘 프롬프트에서 '.MRG' 파일을 직접 다루는 방법은 다음 예와 같다.

【예제】
 # cd /export/home/mysql/var/jijoeDB
 # rm total.MRG    ☜ 고치기 위해서
 # vi total.MRG
  t1
  t2
 # chown mysql:mysql total.MRG
 # chmod 660 total.MRG
 # mysqladmin -p flush-tables

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table  |
| 3 | t1      |
| 1 | Testing |
| 2 | table  |
| 3 | t2      |
+---+---------+
6 rows in set (0.00 sec)
mysql>
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

페이지 정보

최고관리자 작성일12-02-01 18:31 조회799회 댓글0건

댓글목록

등록된 댓글이 없습니다.

MYSQL / R 목록

게시물 검색

사이트 정보

  • 회사명 주인있소 / 대표 소담
  • 주소 강원도 속초시
  • 사업자 등록번호 123-45-67890
  • 전화 010-2026-0626 / 팩스 없음
  • 통신판매업신고번호 제 OO구 - 123호
  • 개인정보관리책임자 정보책임자명

고객센터

상단으로