8.9.2.2 복합 키 캐시
키 캐시에 대한 공유 액세스 성능을 향상 시키지만 세션 간의 충돌을 완전히 제거하지 않습니다. 그들은 여전히 키 캐시 버퍼에 대한 액세스를 관리하는 제어 구조를 얻기 위해 경쟁합니다. 키 캐시 액세스 충돌을 더 줄이기 위해, MySQL은 복합 키 캐시도 제공합니다. 이 기능은 다른 키 캐시에 다양한 테이블 인덱스를 할당 할 수 있습니다.
복합 키 캐시가있는 경우, 서버는 특정 MyISAM
테이블에 대해 쿼리를 처리 할 때 사용해야 캐시를 알고 있어야합니다. 기본적으로 모든 MyISAM
테이블 인덱스는 기본 키 캐시에 캐시됩니다. 테이블 인덱스를 특정 키 캐시에 할당하려면 CACHE INDEX
문을 사용합니다 ( 섹션 13.7.6.2 "CACHE INDEX 구문" 을 참조하십시오). 예를 들어, 다음 명령문은 t1
, t2
및 t3
테이블에서 hot_cache
라는 이름의 키 캐시 인덱스를 할당합니다.
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
CACHE INDEX
문에서 참조되는 키 캐시는 SET GLOBAL
파라미터 설정 명령문에서 그 크기를 설정하거나 서버 시작 옵션을 사용하여 만들 수 있습니다. 예 :
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
키 캐시를 삭제하려면 그 사이즈를 제로로 설정합니다.
mysql> SET GLOBAL keycache1.key_buffer_size=0;
기본 키 캐시는 포기하지 않습니다. 이렇게하면 모든 시도는 무시됩니다.
mysql>SET GLOBAL key_buffer_size = 0;
mysql>SHOW VARIABLES LIKE 'key_buffer_size';
+-----------------+---------+ | Variable_name | Value | +-----------------+---------+ | key_buffer_size | 8384512 | +-----------------+---------+
키 캐시 변수는 이름과 구성 요소의 구조화 된 시스템 변수입니다. keycache1.key_buffer_size
의 경우 keycache1
캐시 변수 이름이며, key_buffer_size
는 캐시 구성 요소입니다. 구조화 키 캐시 시스템 변수를 참조하는 데 사용하는 구문에 대한 자세한 내용은 섹션 5.1.5.1 "구조 시스템 변수" 를 참조하십시오.
기본적으로 테이블 인덱스는 서버 시작시에 생성되는 메인 (디폴트) 키 캐시에 할당됩니다. 키 캐시가 파기되면 그에 할당 된 모든 인덱스는 기본 키 캐시에 재 할당됩니다.
바쁜 서버의 경우 3 개의 키 캐시를 포함한 전략을 사용할 수 있습니다.
모든 키 캐시에 할당 된 공간의 20 %를 차지하는 '핫'키 캐시. 이것은 검색에 자주 사용되지만 업데이트되지 않는 테이블에 사용합니다.
모든 키 캐시에 할당 된 공간의 20 %를 차지한다 "콜드"키 캐시. 이 캐시는 임시 테이블 등 중소 집중적으로 변경되는 테이블에 사용합니다.
키 캐시 공간의 60 %를 차지한다 "따뜻한"키 캐시. 이것은 기본적으로 다른 모든 테이블에 사용되도록 기본 키 캐시로 사용합니다.
3 개의 키 캐시를 사용하여 이점이있는 이유 중 하나는 하나의 키 캐시 구조에 대한 액세스가 다른 액세스를 차단하지 않는 것입니다. 캐시에 할당 된 테이블에 액세스하는 명령문은 다른 캐시에 할당 된 테이블에 액세스하는 명령문과 경쟁하지 않습니다. 성능 향상은 다른 이유에서도 발생합니다.
핫 캐시는 쿼리를 가져 오는 데에만 사용되기 때문에 그 내용이 변경되는 것은 아닙니다. 그 결과, 인덱스 블록을 디스크로부터 꺼낼 필요가있는 경우 항상 대체를 위해 선택된 캐시 블록의 내용을 최초로 플래시 필요가 없습니다.
핫 캐시에 할당 된 인덱스의 경우 인덱스 스캔을 요구하는 쿼리가 없으면 인덱스 B 트리의 리프가 아닌 노드에 대응하는 인덱스 블록이 캐시에 남아있을 가능성이 높습니다.
임시 테이블에 대한 가장 자주 실행되는 업데이트 작업은 업데이트되는 노드가 캐시에 먼저 디스크에서 읽을 필요가없는 경우 훨씬 빠르게 실행됩니다. 임시 테이블의 인덱스 크기가 콜드 키 캐시의 크기와 같은 정도이면 업데이트되는 노드가 캐시에있을 수 높습니다.
CACHE INDEX
문은 테이블과 키 캐시 간의 연결을 설정하지만, 그 협회는 서버가 재시작 될 때마다 손실됩니다. 서버가 시작할 때마다 연결을 사용하려는 경우이를 하나의 방법은 옵션 파일을 사용하는 것입니다. 키 캐시를 구성하는 변수 설정 및 실행되는 CACHE INDEX
문을 포함하는 파일을 지정 init-file
옵션을 포함합니다. 예 :
key_buffer_size = 4G hot_cache.key_buffer_size = 2G cold_cache.key_buffer_size = 2G init_file = /path
/to
/data-directory
/mysqld_init.sql
서버가 시작할 때마다 mysqld_init.sql
명령문이 실행됩니다. 파일에는 한 줄에 하나씩 SQL 문을 포함해야합니다. 다음의 예는 hot_cache
와 cold_cache
에 여러 테이블을 각각 할당합니다.
CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache