15.3 MEMORY 스토리지 엔진
MEMORY
스토리지 엔진 (기존에는 HEAP
라고했습니다)는 메모리에 저장된 내용에서 특정 용도의 테이블을 만듭니다. 데이터 충돌 하드웨어 문제 또는 정전에 약하기 때문에 이러한 테이블은 임시 작업 영역 또는 다른 테이블에서 추출 된 데이터의 읽기 전용 캐시로 사용될뿐입니다.
표 15.4 MEMORY
스토리지 엔진의 기능
스토리지 제한 | RAM | 트랜잭션 | 아니오 | 잠금 입도 | 테이블 |
MVCC | 아니오 | 지리 공간 데이터 형식 지원 | 아니오 | 지리 공간 인덱스의 지원 | 아니오 |
B 트리 인덱스 | 예 | T 트리 인덱스 | 아니오 | 해시 인덱스 | 예 |
전체 검색 인덱싱 | 아니오 | 클러스터 된 인덱스 | 아니오 | 데이터 캐시 | N / A |
인덱스 캐시 | N / A | 압축 데이터 | 아니오 | 암호화 데이터 [a] | 예 |
클러스터 데이터베이스 지원 | 아니오 | 복제 지원 [b] | 예 | 외래 키 지원 | 아니오 |
백업 / 시점 복구 [c] | 예 | 쿼리 캐시 지원 | 예 | 데이터 사전을위한 업데이트 통계 | 예 |
[a] 스토리지 엔진 내부가 아닌 서버에서 (암호화 함수를 사용하여) 구현되어 있습니다. [b] 스토리지 엔진 내부가 아닌 서버에서 구현되어 있습니다. [c] 스토리지 엔진 내부가 아닌 서버에서 구현되어 있습니다. |
MEMORY 또는 MySQL Cluster를 사용하는 경우 중요 업데이트 빈도가 높은 고 가용성의 데이터에 대해 MEMORY
스토리지 엔진을 사용하는 응용 프로그램을 배포하려고 시도하는 개발자는 MySQL Cluster가 더 나은 선택인지 여부를 검토 할 것입니다 . MEMORY
엔진의 전형적인 사례로는 다음과 같은 특징이 있습니다.
세션 관리 및 캐싱 등의 일시적 중요하지 않은 데이터 관련 작업. MySQL 서버를 중지하거나 다시 시작할 때
MEMORY
테이블의 데이터는 손실됩니다.고속 액세스와 낮은 대기 시간을위한 인 메모리 저장. 데이터 볼륨은 메모리에 완전히 장착되고 운영 체제에서 가상 메모리 페이지 스왑 아웃은 없습니다.
읽기 전용 또는 읽기가 대부분의 데이터 액세스 패턴 (업데이트가 제한되어 있습니다).
MySQL Cluster는 MEMORY
엔진과 동일한 기능을 더 높은 성능 수준으로 제공하고 MEMORY
에서 사용할 수없는 추가 기능을 제공합니다.
클라이언트간에 충돌이 적은 행 수준 잠금 및 멀티 스레드 작업.
쓰기를 포함한 문 혼합시의 확장 성.
데이터 지속성을위한 디스크 백업 식 조작 (옵션).
단일 장애 지점이없는 공유 아무것도 아키텍처와 여러 호스트 작업. 99.999 %의 가용성을 제공 할 수 있습니다.
노드에 걸친 자동 데이터 분산. 응용 프로그램 개발자는 사용자의 공유 또는 분할 솔루션을 만들 필요가 없습니다.
가변 길이 데이터 형 (
MEMORY
지원하지 않는BLOB
및TEXT
포함)를 지원합니다.
MEMORY
스토리지 엔진과 MySQL Cluster의 상세한 비교 백서 내용은 MySQL Cluster에 따르면 Web 서비스의 확장 : MySQL Memory 스토리지 엔진의 대체 를 참조하십시오. 이 백서는 두 기술의 성능 조사와 기존 MEMORY
사용자가 MySQL Cluster에 어떻게 이행 할 수 있는지에 대해 설명하는 단계별 가이드가 포함되어 있습니다.
성능의 특징
MEMORY
의 성능은 업데이트 작업시 단일 스레드 실행 및 테이블 잠금 오버 헤드로 인해 충돌에 의해 억제됩니다. 따라서 부하가 증가하면 확장 성이 제한됩니다 (특히, 쓰기를 포함한 문 혼합시).
MEMORY
테이블의 인 메모리 처리에 불구하고 그것들은 범용 쿼리를 위해 또는 읽기 / 쓰기 부하는 반드시 바쁜 서버의 InnoDB
테이블 빠른 일 필요는 없습니다. 특히 업데이트 실행에 관여하는 테이블 잠금은 여러 세션에서 MEMORY
테이블의 병렬 사용의 속도를 저하시킬 수 있습니다.
MEMORY
테이블에서 실행되는 쿼리의 종류에 따라 기본 해시 데이터 구조 (고유 키에서 하나의 값을 검색하는 경우) 또는 범용 B 트리
데이터 구조 (등호, 부등호 미만 또는 "- 이상의 "등의 범위 연산자 등을 포함한 모든 종류의 쿼리의 경우) 중 하나로 인덱스를
만들 수 있습니다. 다음 섹션에서는 두 가지 유형의 인덱스를 생성하는 구문에 대해 설명합니다. 성능면에서 일반적인 문제는 B 트리 인덱스가 더 효율적인 작업 부하에서 기본 해시 인덱스를 사용하는 것입니다.
MEMORY 테이블의 물리적 특성
MEMORY
스토리지 엔진은 각 테이블과 하나의 디스크 파일 (테이블 정의를 저장 (데이터가 없습니다))를 연결합니다. 파일 이름은 테이블 이름에서 시작 .frm
확장자가 붙습니다.
MEMORY
테이블에는 다음과 같은 특징이 있습니다.
MEMORY
테이블 공간은 작은 블록으로 할당됩니다. 테이블은 삽입에 100 % 동적 해시를 사용합니다. 오버 플로우 영역과 여분의 키 영역이 필요하지 않습니다. 면세 표용의 여분의 공간이 필요하지 않습니다. 삭제 된 행은 링크 목록에 저장되고 새 데이터를 테이블에 삽입 할 때 다시 사용됩니다.MEMORY
테이블은 해시 테이블에서 일반적으로 삭제 + 삽입에 관련된 문제도 발생하지 않습니다.MEMORY
테이블은 고정 길이의 행 스토리지 포맷을 사용합니다.VARCHAR
같은 가변 길이 형은 고정 길이를 사용하여 저장됩니다.MEMORY
테이블은BLOB
또는TEXT
컬럼을 포함 할 수 없습니다.MEMORY
은AUTO_INCREMENT
컬럼의 지원을 포함합니다.TEMPORARY
MEMORY
아닌 테이블은 다른TEMPORARY
아닌 테이블과 마찬가지로 모든 클라이언트에서 공유됩니다.
MEMORY 테이블에 DDL 작업
MEMORY
테이블을 작성하려면 CREATE TABLE
문에 ENGINE=MEMORY
절을 지정합니다.
CREATE TABLE t (i INT) ENGINE = MEMORY;
엔진의 이름이 나타내는 바와 같이, 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
테이블의 최대 크기는 max_heap_table_size
시스템 변수에 의해 제한됩니다 (기본값은 16M 바이트). MEMORY
테이블에 서로 다른 크기 제한을 적용하려면이 변수 값을 변경합니다. CREATE TABLE
, 연속 ALTER TABLE
또는 TRUNCATE TABLE
의 실질적인 값은 테이블의 유효 기간에 사용되는 값입니다. 서버를 다시 시작해도 기존의 MEMORY
테이블의 최대 크기가 글로벌 max_heap_table_size
값으로 설정됩니다. 각 테이블의 크기를이 섹션의 뒷부분에서 설명하도록 설정할 수 있습니다.
인덱스
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.3.1 "MySQL의 인덱스 사용 방법" 을 참조하십시오.
MEMORY
테이블은 테이블 당 최대 64 개의 인덱스 인덱스 당 16 개의 컬럼, 3072 바이트의 최대 키 길이를 가질 수 있습니다.
MEMORY
테이블의 해시 인덱스 키의 중복 정도가 높다고 (같은 값을 포함하는 인덱스 항목이 많은) 키 값에 영향을 미치는 테이블에 대한 업데이트 처리와 모든 삭제 처리 속도가 크게 저하됩니다. 이 저하의 정도는 중복의 정도에 비례합니다 (또는 인덱스 중요도에 반비례합니다). BTREE
인덱스를 사용하여이 문제를 해결할 수 있습니다.
MEMORY
테이블은 비 고유 키를 가질 수 있습니다. (이것은 해쉬 인덱스 구현에서는 드문 특징입니다.)
인덱스가 붙은 컬럼에 NULL
값을 포함 할 수 있습니다.
사용자가 만든 임시 테이블
MEMORY
테이블의 내용을 메모리에 저장됩니다. 이것은 MEMORY
테이블이 쿼리를 처리하는 동안 즉석에서 서버가 생성하는 내부 임시 테이블과 공유하는 특성입니다. 그러나 두 가지 유형의 테이블에 차이가 있고, MEMORY
테이블은 스토리지 변환의 영향을받지 않지만, 내부 임시 테이블은 다음과 같은 영향이 있습니다.
내부 임시 테이블이 너무 커지면, 섹션 8.4.4 "MySQL이 내부 임시 테이블을 사용하는 방법" 에 설명 된대로 서버는 자동으로 온 디스크 스토리지로 변환합니다.
사용자가 만든
MEMORY
테이블은 결코 디스크 테이블로 변환되지 않습니다.
데이터로드
MySQL 서버가 시작될 때 MEMORY
테이블을 채우는에는 --init-file
옵션을 사용할 수 있습니다. 예를 들어,이 파일에서 INSERT INTO ... SELECT
또는 LOAD DATA INFILE
과 같은 명령문을 실행하여 영구 데이터 소스에서 테이블을로드 할 수 있습니다. 섹션 5.1.3 "서버 명령어 옵션" 및 섹션 13.2.6 "LOAD DATA INFILE 구문" 을 참조하십시오.
동시에 다른 세션에서 사용 된 MEMORY
테이블에 데이터를로드하기 위해 MEMORY
은 INSERT DELAYED
를 지원하고 있습니다. 섹션 13.2.5.2 "INSERT DELAYED 구문" 을 참조하십시오.
MEMORY 테이블 및 복제
서버의 MEMORY
테이블은 종료되고 다시 시작 된 때 비어 있습니다. 서버가 복제 마스터의 경우, 슬레이브는 이러한 테이블이 비어있는 것을 인식하지 않기 때문에 슬레이브의 테이블에서 데이터를 선택하면 내용이 오래된 것을 알 수 있습니다. 마스터와 슬레이브의 MEMORY
테이블을 동기화하는, MEMORY
테이블이 시작된 이후 마스터 측에서 처음 사용 된 때 슬레이브 측에서 테이블을 비우는 데, DELETE
문이 마스터의 바이너리 로그에 쓰여 합니다. 슬레이브는 마스터 다시 시작과 테이블의 첫 번째 사용 전까지는 테이블의 데이터가 오래 유지됩니다. 슬레이브에 직접 쿼리가 오래된 데이터를 리턴 할 수있는이 기간을 피하려면, --init-file
옵션을 사용하여 시작할 때 마스터에서 MEMORY
테이블을 채우는하십시오.
메모리 사용량 관리
서버는 동시에 사용되는 모든 MEMORY
테이블을 유지하기위한 충분한 메모리가 필요합니다.
MEMORY
테이블에서 행을 삭제해도 메모리는 재사용되지 않습니다. 전체 테이블이 삭제 된 경우에만 메모리가 재사용됩니다. 삭제 된 행 이전에 사용 된 메모리는 같은 테이블에 새 행에 재사용됩니다. MEMORY
테이블의 내용이 필요하지 않을 때, 그것은 사용하고 있던 모든 메모리를 해제하려면 DELETE
또는 TRUNCATE TABLE
을 실행하고 모든 행을 삭제하거나 DROP TABLE
을 사용하여 테이블 를 완전히 제거합니다. 삭제 된 행이 사용하고 있던 메모리를 해제하려면 ALTER TABLE ENGINE=MEMORY
를 사용하여 테이블을 강제로 다시 만듭니다.
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()
행의 길이를 char
포인터 크기의 단지 배수하기 위해 절상 계수를 나타냅니다. sizeof(char*)
는 32 비트 시스템에서는 4,64 비트 컴퓨터는 8입니다.
전에 언급했듯이, max_heap_table_size
시스템 변수는 MEMORY
테이블의 최대 크기 제한을 설정합니다. 각 테이블의 최대 크기를 제어하려면 각 테이블을 만들기 전에이 변수 세션 값을 설정합니다. (모든 클라이언트가 작성한 MEMORY
테이블에 글로벌 max_heap_table_size
값을 사용하는 것이 아니라면이 값을 변경하지 마십시오.) 다음은 두 MEMORY
테이블 (최대 크기가 각각 1M 바이트와 2M 바이트)를 생성 하는 예입니다.
mysql>SET max_heap_table_size = 1024*1024;
Query OK, 0 rows affected (0.00 sec) mysql>CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;
Query OK, 0 rows affected (0.01 sec) mysql>SET max_heap_table_size = 1024*1024*2;
Query OK, 0 rows affected (0.00 sec) mysql>CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;
Query OK, 0 rows affected (0.00 sec)
두 테이블은 서버가 다시 시작하면 서버의 글로벌 max_heap_table_size
값으로 돌아갑니다.
MEMORY
테이블에 대해 CREATE TABLE
문 MAX_ROWS
테이블 옵션을 지정하여 테이블에 저장하려는 행 수에 관한 힌트를 제공 할 수 있습니다. 이에 따라 max_heap_table_size
값 (계속 최대 테이블 크기의 제약으로 기능)을 넘어 테이블을 확대 할 수 없습니다. MAX_ROWS
를 사용하기에 최대한의 유연성을 얻으려면 적어도 각 MEMORY
테이블이 증가 할 수있는 값 정도에 max_heap_table_size
을 설정하십시오.
추가 리소스
MEMORY
스토리지 엔진에 특화된 포럼은 http://forums.mysql.com/list.php?92 에서 볼 수 있습니다.