본문 바로가기

카테고리 없음

MySQL 5.5.8 MyISAM v1.0

MySQL 5.5.8 MyISAM 

from

 

1.    MyISAM

<설명>

5.5 이전에 MySQLAB 의 기본 Storage Engine

(5.5 부터 InnoDB 가 기본 Storage Engine 으로 변경되었다.)

테이블을 (frm, MYD, MYI) 로 표현

MySQL Database(=Schema) MyISAM Storage Engine 을 사용

압축테이블 사용가능

 

2.    MyISAM Lock

<설명>

명시적으로 설정함

Flush Tables With Read Lock : 전체 인스턴스 레벨의 Lock 해제 명령

 

<문법>

락 설정

LOCK TABLE TABLE_NAME LOCK_TYPE [,TABLE_NAME LOCK_TYPE …]

 

ex : lock table table_name write

 

락 해제

UNLOCK TABLES

 

LOCK_TYPE => READ, WRITE, READ LOCAL, LOW_PRIORITY WRITE

 

<예제>

a.    READ LOCK 설정 후 INSERT 시도

 

mysql> lock table hello read;

Query OK, 0 rows affected (0.01 sec)

 

mysql> insert into hello values(2);

ERROR 1099 (HY000): Table 'hello' was locked with a READ lock and can't be updated

 

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

 

b.    WRITE LOCK 설정 후 READ 시도

<1번세션>

mysql> lock table hello write;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from hello;

+------+

| id   |

+------+

|    1 |

+------+

1 row in set (0.00 sec)

 

<2번세션>

mysql> select * from hello;

((대기함))

 

<1번세션>

unlock tables 를 사용하는 순간 2번세션이 요청했던 쿼리가 실행된다.

 

3.    MyISAM Full Text Search

<설명>

char, varchar, text 에 사용가능하며 MyISAM 에서만 사용가능

Search Type 으로 Boolean, Natural Language, Query Expansion Search 가 있다

기본 Search Type Natural Language 이다.

 

<문법>

MATCH (column1, column2 …) AGAINST (expr )

 

<예제>

/*+ 추가할 것 */

 

4.    MyISAM Format

<종류>

Fixed-row Format    : 모든 row 의 사이즈가 동일하다.

Dynamic-row Format : row 의 길이가 다양하다.

Compressed Format  : MyISAM Table 을 압축한다. 압축된 테이블은 Read Only 가 된다.

 

<Compressed Format 예제>

mysql> create table id(id1 char(255),id2 char(255)) engine=myisam;

Query OK, 0 rows affected (0.01 sec)

- MyISAM Storage Engine 으로 id 라는 테이블을 만들었다.

 

mysql> insert into id values('1','1');

Query OK, 1 row affected (0.00 sec)

- 위 값을 수십개 넣었다. 지면 관계상 생략하겠다. (아직 루틴을 사용 못함 ;;)

 

oracle32@/home/mysql/mysql/data/test>ls -la

total 156

drwxr-xr-x 2 mysql mysql  4096 Jan 28 07:56 .

drwxr-xr-x 5 mysql mysql  4096 Jan 28 07:54 ..

-rw-r--r-- 1 mysql mysql     0 Dec  4 03:50 .empty

-rw-rw---- 1 mysql mysql  8586 Jan 26 14:42 hello2.frm

-rw-rw---- 1 mysql mysql    55 Jan 26 14:42 hello2.MYD

-rw-rw---- 1 mysql mysql  2048 Jan 26 14:42 hello2.MYI

-rw-rw---- 1 mysql mysql  8556 Jan 26 13:28 hello.frm

-rw-rw---- 1 mysql mysql  8586 Jan 28 07:56 id.frm

-rw-rw---- 1 mysql mysql 84826 Jan 28 07:58 id.MYD

-rw-rw---- 1 mysql mysql  1024 Jan 28 07:58 id.MYI

-rw-rw---- 1 mysql mysql  8586 Jan 19 23:01 sample.frm

- 압축하기전의 id.MYD 를 보면 83kb 정도이다.

 

oracle32@/home/mysql/mysql/data/test>/home/mysql/mysql/bin/myisampack id

Compressing id.MYD: (166 records)

- Calculating statistics

- Compressing file

99.16%    

oracle32@/home/mysql/mysql/data/test>ls -la

total 72

drwxr-xr-x 2 mysql mysql 4096 Jan 28 08:01 .

drwxr-xr-x 5 mysql mysql 4096 Jan 28 07:54 ..

-rw-r--r-- 1 mysql mysql    0 Dec  4 03:50 .empty

-rw-rw---- 1 mysql mysql 8586 Jan 26 14:42 hello2.frm

-rw-rw---- 1 mysql mysql   55 Jan 26 14:42 hello2.MYD

-rw-rw---- 1 mysql mysql 2048 Jan 26 14:42 hello2.MYI

-rw-rw---- 1 mysql mysql 8556 Jan 26 13:28 hello.frm

-rw-rw---- 1 mysql mysql 8586 Jan 28 07:56 id.frm

-rw-rw---- 1 mysql mysql  721 Jan 28 07:58 id.MYD

-rw-rw---- 1 mysql mysql 1024 Jan 28 08:01 id.MYI

-rw-rw---- 1 mysql mysql 8586 Jan 19 23:01 sample.frm

- 압축을 진행한 후 확인하니 id.MYD 크기가 작아졌다. MYI 는 변함이 없는 걸 알 수 있다.

 

mysql> insert into id values('1','1');

Query OK, 1 row affected (0.00 sec)

- 압축 한 후 데이터를 아까와 동일한 데이터 입력에 성공하였다.

 

이전버전에서는 압축 후 Data Insert 시도시 에러가 난다. 위 값 말고도 다양한 값을 넣어보았으나 값이 이상없이 입력이 되었다. 이전 버전에서 에러가 나왔을 때의 메시지는 해당 테이블이 Read Only 라 입력이 불가능하다란 메시지다.

 

/*+다량의 데이터를 넣었을 때 파일시스템에서 MYD 크기에 변화도 없는 것으로 보아 압축했어도 입력을 받을 여유공간을 가지고 있는 것으로 추측된다.*/

 

5.    MyISAM Merge

<정의>

동일한 구조의 MyISAM 테이블의 모임이다. (union all 로 묶어놓은 view 라 생각하면 된다.)

Primary Index 사용이 불가능하다.

 

<예제>

mysql> create table id1(id int);

Query OK, 0 rows affected (0.00 sec)

 

mysql> create table id2(id int);

Query OK, 0 rows affected (0.01 sec)

 

mysql> insert into id1 values(1);

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into id1 values(2);

Query OK, 1 row affected (0.01 sec)

 

mysql> insert into id2 values(2);

Query OK, 1 row affected (0.01 sec)

 

mysql> create table id(id int)

    -> engine=merge union=(id1,id2)

    -> insert_method=last;

Query OK, 0 rows affected (0.01 sec)

- Union 이라 해서 distinct 한 값을 보여주진 않는다. 아래 조회 결과를 보면 중복된 값들도 나옴을 알 수 있다. ORACLE UNION ALL 를 연상하면 될 것 같다.

mysql> select * from id;

+------+

| id   |

+------+

|    1 |

|    2 |

|    1 |

+------+

3 rows in set (0.00 sec)

 

6.    MyISAM Key Cache

<정의>

MyISAM Storage Engine 이 인덱스 블록을 메모리에 저장하는데 사용함

Key Buffer Size 를 이용해 설정함

CACHE INDEX 명령을 사용해 저장한다.

 

mysql> set global secondary.key_buffer_size=12*1024;

Query OK, 0 rows affected (0.01 sec)

- Key Cache 영역으로 Secondary 를 선언하였고 12M 를 할당했다.

mysql> cache index id1 in secondary;

+----------+--------------------+----------+----------+

| Table    | Op                 | Msg_type | Msg_text |

+----------+--------------------+----------+----------+

| test.id1 | assign_to_keycache | status   | OK       |

+----------+--------------------+----------+----------+

1 row in set (0.00 sec)

- id1 ‘secondary key’cach 에 할당하였다.