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 에 할당하였다.