2010년 11월 28일 일요일

MySQL해킹

어떤 새로운 Native SQL함수를 추가하려는 경우나  새로운 데이터형을 추가하려는 경우 각각 DDL문과 DML문에 있어서 심볼로 먹힐려면 SQL파서를 개조하지않으면 SQL구문해석할 때에문법에러처리되게 된다

그래서 여기서부터는 SQL파서 개조에 대해서 이야기해 볼 까한다.

보통 SQL에서는 "SELECT ... FROM .. "등의 문법에 따라서 SQL문을 작성해서 서버에 송신하지만 여기에서는 "Hello World"라는 명령어를 새로운 SQL 명령어로서 MySQL에 추가해 볼 것이다.

또,   비교적 간단한 것으로 시스템 변수 (my.cnf에서 지정가능하고 SHOW VARIABLES에서 확인가능)의 추가,  상태변수( SHOW STATUS로 확인가능)의 추가에서도 소개해 볼까한다.


이런 해킹은 현실적으로 그다지 필요하지 않을지도 모르겠지만 MySQL를 업무로 다루는 기술자에게는 "몰라, 해킹않해!" 보다는  "해킹할 수 있는 지식도 있고 내부도 잘 알고 있지만  여러가지 이유로 공식바이너리를 사용해!" 라는 자세가 필요하다고 본다.

 

2010년 10월 18일 월요일

파티셔닝5

서브 파티셔닝


RANGE와 LIST일 때 각 파티션을 더 분할할 수가 있다.  매뉴얼에서는 이것을 서브파티션이라고 부른다.

예1>
CREATE TABLE ptrange( a INT, b INT, c CHAR(10) )
    PARTITION BY RANGE(a)
      SUBPARTITION BY HASH(a)
     (
       PARTITION pt0 VALUES LESS THAN ( 1000)
      (
          SUBPARTITION s0,
          SUBPARTITION s1
      ),
      PARTITION pt1 VALUES LESS THAN MAXVALUE
     (
         SUBPARTITION s2,
         SUBPARTITION s3
      )
    );

예2>
CREATE TABLE ptrange( a INT, b INT, c CHAR(10) )
    PARTITION BY RANGE(a)
      SUBPARTITION BY HASH(a)
         SUBPARTITIONS 2
        (
          PARTITION pt0 VALUES LESS THAN (1000),
          PARTITION pt1 VALUES LESS  THAN MAXVALUE
        );

MySQL의 파티셔닝에 대해서  정리해보았다.  꽤 유연하게 파일을 분할할 수 있다는 것을 알 수 있다.   한개의 테이블이 큰 경우에는  파티셔닝의 채용을 검토 해 보자.

2010년 10월 14일 목요일

파티셔닝4

파티셔닝의 방법 

MySQL의 파티셔닝방법에는  RANGE, LIST, HASH, KEY의 4가지 방법이 제공된다.
이것은 PARTITION BY로 지정한다.

  • RANGE: 지정된 컬럼 값에 의해서 파티셔닝을 한다.  컬럼명을 지정하는 경우에는 정수형이어야하고 함수식을 지정하는 경우에는  정수를 리턴하는 함수이어야 한다.  조건의 판정에는 VALUES LESS THAN를 사용한다. MAXVALUE는 최대값을 의미한다.

CREATE TABLE ptrange( a INT)
   PARTITION BY RANGE(a) (
     PARTITION pt0 VALUES LESS THAN ( 1000 ), 
     PARTITION pt1 VALUES LESS THAN MAXVALUE ); 

  • LIST: 지정된 값에 의해서 파타셔닝을 한다.  컬럼명만을 지정하는 경우에는 정수형이어야하고 함수식을 지정하는 경우에는 정수를 리턴하는 함수이어야 한다.  조건을 지정할때에는 각 파티션정의에 VALUES IN(값 [값,...])을 사용한다. 

 CREATE TABLE ptlist( a INT UNSIGNED)
   PARTITION BY LIST(a) (
     PARTITION pt0 VALUES IN (1,4),
     PARTITION pt1 VALUES IN (2,5),
     PARTITION pt2 VALUES IN (3,6)  );

  • HASH: 지정된 값에 따라서 MySQL이 행을 자동으로 나눈다.  컬럼명만을 지정하는 경우에는 정수형이어야하고 함수식을 지정하는 경우에는 정수를 리턴하는 함수이어야 한다.  

CREATE TABLE pthash(a INT, b INT, c CHAR(10) ) 
     PARTITION BY HASH(a) 
     PARTITION 2;

  • KEY: 지정된 값에 따라서 MySQL이 행을 자동으로 나눈다.  0개이상의 컬럼명(함수)를 지정할 수 있다.  값을 지정하지 않은 경우 테이블의 PRIMARY KEY가 자동적으로 채용된다. 

CREATE TABLE ptkey(a INT, b INT, c CHAR(10) ) 
    PARTITION BY KEY(a, b, c)
    PARTITIONS 2;

 CREATE TABLE ptkey( a INT PRIMARY KEY, b INT, c CHAR(10) ) 
    PARTITION BY KEY()
    PARTITIONS 2;

2010년 9월 16일 목요일

파티셔닝3

파티셔닝의 제한

5.1.12-beta에서 다음과 같은 제한이 있다.

  • 파티셔닝된 테이블은 스토리지엔진이 같아야 된다. 
  • 외부키 제약은 사용할 수 없다. 
  • FULLTEXT인덱스를 사용할 수 없다. 
  • GIS컬럼을 사용할 수 없다. 
  • 임시테이블, MERGE스토리지엔진, CSV스토리지엔진은 파티셔닝할 수 없다. 

파티셔닝의 지정 

파티셔닝의 지정은 다음과 같이 한다.

CREATE TABLE 테이블명 (컬럼 정의) 
 PARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY(expr) }
[ PARTITIONS 파티션갯수]


CREATE TABLE 테이블명(컬럼정의)
 PARTITION BY { RANGE(expr) | LIST(expr) }
[ SUBPARTITION BY { [LINEAR] HASH() | [LINEAR] KEY() }
    [ SUBPARTITIONS 서브파티션갯수 ]
]
(파티션정의 [, 파티션정의] ... )

파티션정의:
   PARTITION 파티션명
     [ VALUES { LESS THAN (expr) | MAXVALUE } ] <--RANGE인 경우
     [ VALUES IN (값 리스트) ]   <--LIST인 경우
     [ 테이블 옵션]
     [ TABLESPACE [=] (NDB Cluster의 테이블영역명) ]
     [ NODEGROUP [=] MySQL Cluster의 node_group_id ]
     [(서브 파티션정의 [, 서브파티션정의 ]...) ]

서브파티션정의:
   SUBPARTITION 서브파티션명
     [ 테이블옵션 ]
     [ TABLESPACE [=] (NDB Cluster의 테이블영역명) ]
     [ NODEGROUP [=] MySQL Cluster의 node_group_id ]

테이블옵션:
  보통 CREATE TABLE문에서 지정할 수 있는 ENGINE= 키워드등의 테이블옵션. 파티션정의구문에서는 다음을 사용할 수 있다.
       [STORAGE] ENGINE [=] 스토리지엔진명
       COMMENT [=] 코멘트
       DATA DIRECTORY [=] '.MYD파일의 저장디렉토리'
       INDEX DIRECTORY [=] '.MYI파일의 저장디렉토리'
      MAX_ROWS [=] '테이블에 들어가는 최대 행수'
      MIN_ROWS [=] '테이블에 들어가는 최소 행수'