2012-08-26 5 views
0

내 질문에 관한 정보를 찾을 수 없습니다. 이것은 더 이론적 인 질문입니다. 예를 들어, 테이블 이 있습니다.스왑의 MySQL InnoDB 인덱스

CREATE TABLE IF NOT EXISTS `keywords` (
    `kid` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `language_id` int(11) NOT NULL, 
    `keyword` varchar(120) NOT NULL, 
    PRIMARY KEY (`kid`), 
    UNIQUE KEY `custom_idx` (`language_id`,`keyword`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

제 서버의 RAM 메모리는 1GB입니다. 내 테이블에 수백만 개의 행이 있고 내 custom_idx 크기가 1GB 이상입니다. 인덱스가 RAM 메모리에 맞지 않습니다.. mysql은 무엇을 할 것인가? 이 색인의 일부만이 메모리에 저장됩니까? BTREE/Clustered 인덱스 성능이 현저하게 떨어질까요?

내 인덱스의 크기가 innodb_buffer_pool_size 제한에 맞지 않을 경우 어떻게됩니까?

인덱스가 RAM 메모리에 맞지 않는 엄청난 InnoDB 데이터베이스에 대한 복제는 복제입니까?

+0

나는 MYISAM : 분리 파일 및 색인 생성을 어떻게하는지 육안보기에서 확인했습니다. "egnine"은 InnoDB에서 할 수 있지만 낮은 수준에서 어떻게 수행했는지는 확인하지 않았기 때문에 질문에 대한 답을 알 수는 없지만 다음과 같은 큰 데이터베이스에 대한 내 경험으로 볼 때 훨씬 더 좋습니다 DB, "O"로 시작하고 "racle"으로 끝나는 :) 나에게는 1 백만이 한계 다. –

답변

1

InnoDB는 InnoDB 버퍼 풀 (크기는 innodb_buffer_pool_size 변수를 사용하여 제어 됨)을 사용하여 행 데이터와 색인을 포함하여 많은 다른 데이터 구조를 캐시합니다. 데이터 세트가이 버퍼 풀에 비해 너무 큰 경우, MySQL은 물론 스왑합니다. 효과가 얼마나 극적인지, 측정해야합니다. "간신히"눈에 띄는 것 "과"쿼리가 1000 배 더 오래 걸리는 것 "사이에있을 수 있습니다.

복제가 가장 확실한 해결책은 아닙니다. 복제는 데이터를 다른 컴퓨터와 동기화 만하며 스키마 차이 (예 : 서로 다른 인덱스를 염두에 둔 경우)를 허용하지 않습니다. 그 다른 머신이 똑같이 제대로 작동하지 않는다면 느린 데이터베이스 서버 하나가 아닌 두 대가 나온다. 첫 번째 서버에 더 많은 메모리를 설치해야합니다.

0

InnoDB는 최대한 많은 데이터를 메모리에로드합니다. 메모리에 맞지 않는 경우에는로드하지 않습니다. 이것은 2 가지 부작용이 있습니다. 첫째, RAM에없는 데이터를 조회해야하는 경우 디스크에서로드해야합니다. 그러나 먼저 메모리에있는 변경된 데이터를 디스크로 플러시해야합니다. 또한 고유 인덱스가 메모리에 맞지 않으면 행을 삽입/업데이트하려고 할 때 디스크에서 인덱스를 읽어야합니다. 고유 인덱스가 메모리에 맞지 않을 때 삽입 속도가 느린 것은 모든 인덱스 값을 읽어야하는 몇 가지 조건 중 하나이기 때문에 이것은 눈에 띄는 첫 번째 성능 문제 중 하나입니다.

복제가 아니지만 샤딩/파티셔닝은 다른 서버의 RAM에 데이터 세트를 맞추는 방법입니다.