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>
모아 사용할 모든 테이블은 동일한 컬럼을 가지며 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>
댓글목록
등록된 댓글이 없습니다.