2. DBMS이야기/02. MySQL

The MEMORY (HEAP) Storage Engine (1)

OSSW(Open Source System SoftWare 2014. 7. 3. 09:52

14.4 The MEMORY (HEAP) Storage Engine

MEMORY 스토리지 엔진은 메모리에 저장되어있는 내용으로 테이블을 생성한다. 이전에는 이러한 HEAP 테이블로 알려져 있었다. HEAP는 이전 버전과의 호환성을 위해 지원 남아 있지만 메모리가 선호하는 용어다.

MEMORY 스토리지 엔진은 하나의 디스크 파일로 각 테이블을 연결한다. 파일 이름은 테이블 이름으로 시작하고 테이블 정의를 나타내는 .frm 확장자로 저장되었음을 나타낸다

당신이 MEMORY 테이블을 생성하도록 표시하기 위해서는, ENGINE 테이블 옵션을 사용한다 :

CREATE TABLE t (i INT) ENGINE = MEMORY;

오래된 용어 TYPE은 이전 버전과의 호환성을 위해 엔진의 동의어로 지원되지만, 엔진은 선호하는 용어를 쓰고, TYPE은 사용하지 않는다.

엔진 이름 바와 같이, MEMORY 테이블은 메모리에 저장된다. 그들은 임시 테이블을 작성하기에 매우 빠르고, 매우 유용하다. 기본적으로 해시 인덱스를 사용합니다. 그러나 서버가 종료 될 때 MEMORY 테이블에 저장되어있는 모든 행이 손실된다. 테이블 자체가 자신의 정의는 디스크에 FRM 파일로 저장되어 있기 때문에 계속 존재하지만, 이 경우 서버가 다시 시작되면 비워진다.

이 예제를 작성, 사용 및 MEMORY 테이블을 제거하는 방법을 보여준다 :

mysql> CREATE TABLE test ENGINE=MEMORY
    ->     SELECT ip,SUM(downloads) AS down
    ->     FROM log_table GROUP BY ip;
mysql> SELECT COUNT(ip),AVG(down) FROM test;
mysql> DROP TABLE test;

MEMORY 테이블은 다음과 같은 특징이있다 :

  • MEMORY 테이블을 위한 공간은 작은 블록에 할당된다. 테이블 삽입을 위해 100 % 동적 해시를 사용한다. 오버 플로우 또는 엑스트라 키 공간이 필요하지 않다. 여분의 공간은 free list를 필요로 하지 않는다. 삭제 된 행은 링크 된 목록에 배치되고, 테이블에 새 데이터를 삽입 할 때 다시 사용된다. MEMORY 테이블은 또한 일반적으로 해시 테이블의 삽입과 삭제에 관련된 문제가 없다.

  • MEMORY 테이블은 테이블 당 최대 64 개의 인덱스와, 인덱스별로 16 개의 컬럼과 3072 바이트의 최대 키 길이를 가질 수있다.

  • MEMORY 스토리지 엔진은 HASH 및 BTREE 인덱스를 모두 지원한다. 다음과 같이 당신은 USING 절을 추가하여 하나 주어진 인덱스에 대한 다른 인덱스를 지정할 수 있다:

    CREATE TABLE lookup
        (id INT, INDEX USING HASH (id))
        ENGINE = MEMORY;
    CREATE TABLE lookup
        (id INT, INDEX USING BTREE (id))
        ENGINE = MEMORY;
    

    B-트리와 해시 인덱스의 일반적인 특성은 섹션 8.5.3, "MySQL이 인덱스를 사용하는 방법"을 참조하십시오.

  • MEMORY 나타난 해시 인덱스 키 중복 (동일한 값을 포함하는 다수의 인덱스 항목)의 높은 수준을 가지고있는 경우, 키 값과 모든 삭제에 영향을 표에 대한 업데이트가 상당히 느리다. 이 감속의 정도는 중복도 (또는, 인덱스 카디널리티에 반비례)에 비례한다. 당신은이 문제를 방지하기 위해 B-TREE index를 사용할 수 있다.

  • MEMORY 테이블은 고유하지 않은 키를 가질 수 있다. (이 해시 인덱스의 구현을위한 거의 사용하지 않는 기능이다.)

  • 인덱싱 된 열은 NULL 값을 포함 할 수 있다.

  • MEMORY 테이블은 고정 길이 열 저장 형식을 사용한다. VARCHAR와 같은 가변 길이 형식은 고정 길이를 사용하여 저장된다.

  • MEMORY 테이블은 BLOB 또는 TEXT 컬럼을 포함 할 수 없다.

  • 메모리는 AUTO_INCREMENT 컬럼에 대한 지원이 포함되어 있다.

  • 메모리는 지연된 insert를 지원합니다. "INSERT 구문 지연", 절 13.2.5.2을 참조.

  • 비 임시 메모리 테이블은 TEMPORARY 테이블이 아닌 모든 다른 것과 마찬가지로, 모든 클라이언트에서 공유된다.

  • MEMORY 테이블 내용은 MEMORY 테이블이 쿼리를 처리하는 동안 서버가 즉석에서 만들어 내부 임시 테이블을 공유하는 속성이 메모리에 저장된다. 반면, 두 종류의 테이블은 메모리 테이블에 저장 변환이 적용되지 않지만, 내부 임시 테이블은 저장 변환이 된다는 점에서 다르다. :

  • 서버는 동시에 사용되는 모든 MEMORY 테이블을 유지하기 위해 충분한 메모리를 필요로한다.

  • MEMORY 테이블에서 개별 행을 삭제하면 메모리가 회수되지 않는다. 메모리는 전체 테이블이 삭제 된 경우에만 회수된다. 이전에 삭제 된 행에 사용 된 메모리는 같은 테이블에서 새 행에 다시 사용된다. 삭제 된 행에서 사용하는 메모리를 확보하기 위해, 테이블을 강제로 리빌드 하는  ALTER TABLE ENGINE=MEMORY 를 사용합니다.

    더 이상 그 내용이 필요하지 않을 때, execute DELETE 또는 TRUNCATE TABLE로 모든 행을 제거하거나 DROP TABLE을 사용하여 모두 테이블을 제거해야 MEMORY 테이블에서 사용하는 모든 메모리가 해제된다.

  • 초기화 파일 옵션( --init-file)으로 MySQL 서버가 시작될 때 MEMORY 테이블을 채울 수 있다. 예를 들어, 다음과 같은 문장을 넣을 수 있다. INSERT INTO ... SELECT or LOAD DATAT INFILE 로 영구 데이터 소스에서 테이블로 로드할 수 있다.  See Section 5.1.3, “Server Command Options”, and Section 13.2.6, “LOAD DATA INFILE Syntax”.

  • 서버가 꺼졌다가 다시 시작되면 메모리 테이블이 비워진다. 그러나 만약 서버가 복제의 마스터인 경우, 슬레이브가 비워질 것이라는 걸 인식하지 못한다. 그래서 이런 테이블의 데이터를 선택하면 out-of-date를 반환한다. 이 문제를 해결하기 위해, 메모리테이블은 서버가 시작될 때 처음으로 마스터를 사용한다.

  • . is used on a master for the first time since it was started, DELETE 문은 이마스터 슬레이브 동기화를 통해, 자동으로 마스터의 바이너리 로그에 기록한다. 이 전략으로, 슬레이브는 마스터가 재시작되는 사이에 테이블에서 outdated data를 가진다. 그러나 만약 메모리 테이블에서 마스터가 시작할 때 --init-file 옵션을 사용하면 이런 시간 간격이 없도록 보장한다. 

  • MEMORY 테이블에 하나의 행에 필요한 메모리는 다음과 같은 식을 사용하여 계산된다 :

    SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) × 4)
    + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) × 2)
    + ALIGN(length_of_row+1, sizeof(char*))
    

    ALIGN() 는 32 비트 시스템에서 4 비트 및 64 비트 시스템에서 8인 행 길이를 문자 포인터 size.sizeof(char*) 로 정확하게 배수하게 한다.


http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

BY lee ji eun