2009년 6월 23일 화요일

Falcon 파일: 데이터형과 영역관리

Falcon에서는 GIS(지리정보형)을 포함, MySQL표준 데이터형을 전부 이용하는 것이 가능하다.

이 이외에도 데이터형에 관계없이 모든 컬럼이 가변형으로 다루어진다.

또 데이터형 자신의 정의된 사이즈가 아니라 실제로 사용된 사이즈만큼(+컬럼크기를 관리하기위한 영역)만이지만 파일영역으로 사용된다.

이것은 가변크기 문자열형(VARCHAR, TEXT등)만 아니라 CHAR형이나 정수형등에도 해당된다.

예를 들어 INTEGER형은 InnoDB나 MyISAM에서는 4바이트 고정사이즈 이지만 만약 값이 1이나 10등 1바이트로 표현가능한 범위이면 Falcon에서는 그 1바이트하고 컬럼사이즈를 관리하는 1바이트로 계 2바이트만 사용된다.

또 BLOB형을 효율있게 사용할수 있도록하고 있는 것이 Falcon의 특징이기도 하다.
BLOB형의 컬럼은 타른 컬럼과는 별도의 영역(page)에서 관리된다.

일반적으로 BLOB형의 실제 데이터는 다른 컬럼에 비교해 크게될 경향이 있다.
종래의 스토리지엔진에서는 특히 사이즈가 크게 바뀌는 갱신을 수행하게 되면 레코드의 fragmentation(단편화)가 문제가 되었다.

그러나 Falcon에서는 관리하는 페이지가 BLOB형과 그외의 것이 다르기 때문에 이런 문제를 회피할 수 있다.

또 레코드의 갱신을 수행할 경우등에 있어서 필요가 없는 한 물리적인 이동은 발생하지 않도록 하고 있다.

AUTO_INCREMENT동작의 차이

AUTO_INCREMENT(시퀀스)의 동작은 Falcon하고 InnoDB에서 약간 차이가 있다.
구체적으로 MySQL본체 프로세스 mysqld를 재기동한 다음, 그 다음에 할당되는 AUTO_INCREMENT값의 결정방식이 다음처럼 다르다.

  • Falcon, MyISAM: 해당 테이블에 지금까지 할당된 최대값 +1
  • InnoDB:해당 테이블의 현재의 최대값 +1
Falcon은 MyISAM하고 같은 방식을 채용하고 있다.

레코드의 삽입(오토커밋모드, 컬럼 id는 id int(11) NOT NULL AUTO_INCREMENT)
mysql>INSERT INTO tbl1(id) VALUES(null);
mysql>INSERT INTO tbl1(id) VALUES(null);
mysql>INSERT INTO tbl1(id) VALUES(null);
mysql>INSERT INTO tbl1(id) VALUES(100);
mysql>DELETE FROM tbl1 WHERE id=100;
mysql>SELECT id FROM tbl1;
+---+
| id |
+---+
| 1 |
| 2 |
| 3 |
+---+

이 다음 mysqld를 재기동하고 AUTO_INCREMENT값을 갱신시켜보자.

AUTO_INCREMENT값의 갱신
mysql>INSERT INTO tbl1(id) VALUES(null);

이 때 결과는 Falcon, MyISAM하고 InnoDB는 다르다.

Falcon, MyISAM의 경우
mysql>SELECT id FROM tbl1;
+----+
| id |
+----+
| 1|
| 2|
| 3|
| 101|
+----+

InnoDB의 경우
mysql>SELECT id FROM tbl1;
+----+
| id |
+----+
| 1|
| 2|
| 3|
| 4|
+----+

mysqld를 재기동하지 않는 경우는 어디든 101이 된다.