2011-08-17 2 views
0

나는 매우 큰 테이블을 가지고 있으며 id look ups와 같은 매우 간단한 쿼리를 수행합니다. 테이블 행이 증가하여 쿼리가 시간이 지남에 따라 느려집니다. 두 번째로 약 300 개의 쿼리를 수행하면 내 스크립트가 느리게 실행되고 내 메모리가 99 % (메모리가 DB 크기보다 작음)가됩니다. 최대 성능을 위해 테이블을 분할하고 하위 분할하려면 여기를 클릭하십시오. (그것을 좋아하는 30 개의 테이블 중에서), 나는 파티셔닝에 매우 익숙하고 많은 것을 알지 못하기 때문에 코드를 추가하십시오. select 쿼리는 id lookup 및 간단한 삽입을위한 절이있는 곳입니다. RAM을 업그레이드하여 DB 크기보다 더 늘리고 싶지만 문제가 해결되지 않으면 파티션을 더 잘 처리 할 수 ​​있을지 모르겠다.분할 및 서브 분할 기본 키 및 성능을 높이기 위해 2 개의 인덱스에 의한 mysql 테이블

SELECT id FROM books WHERE url = 'blabla'; 
INSERT INTO user_books SET book_id = '3', user_id = '10'; 

각 쿼리는 약 0.05-0.2 초

내가 각 테이블의 주위 5-10000000 행을 가지고 취 여기

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `url` (`url`(333)), 
    INDEX `name` (`name`) 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=937 

내 쿼리의 몇 가지 예입니다.

DB 크기는 내가 방금 파티션을 추가하려고 할 경우에, 나는 키 파티션을 사용하는 것이 좋습니다 것 16기가바이트

+0

"매우 큰"행은 몇 개입니까? 실행하는 쿼리의 예는 무엇입니까? 설명 계획은 어떻게 생겼습니까? 각 쿼리에는 어느 정도의 기간이 소요됩니까? –

+0

@Derek 내가 질문 한 내용으로 질문을 편집했습니다. – Ben

+0

innodb를 사용하고 가능한 경우 클러스터 된 인덱스 활용 http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 –

답변

2

에 RAM을 업그레이드하는 방법에 대한 생각 10기가바이트입니다. 이것은 본질적으로 파티션으로 지정된 열에 적용된 내부 해시 함수로 테이블을 파티션 만합니다. 귀하의 경우에는

는 쿼리는 가장 id를 사용하는 것, 이것이 기본 키이기 때문에, 구문은 매우 간단합니다 :

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `url` (`url`(333)), 
    INDEX `name` (`name`) 
) 
PARTITION BY KEY() 
PARTITIONS 8; 
COLLATE='utf8_unicode_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=937 

는 위의 8 개 개의 파티션을 생성합니다. partitioning 절에 사용할 열을 지정하지 않았기 때문에 MySQL은 기본적으로 기본 키를 사용하므로 기본값으로 사용하면됩니다.

id 열에 사용 된 정수 값의 분산이 적당하다고 가정하면 각 파티션은 약 1.25GB가됩니다. 특정 ID에 대한 쿼리를 실행하면 하나의 파티션에서만 데이터를 선택해야하므로 더 빠르게 액세스 할 수 있습니다. ID가 기본 키, http://dev.mysql.com/doc/refman/5.5/en/partitioning-key.html

없이 말을, 그래서 이것은 이미 상당히 확대됨에 있었어야 :

은 현재 MySQL의 설명서를 참조 할 수 있습니다. MyISAM을 사용하여 인덱스 + 파티션에 적용될 수있는 더 많은주의 사항을 확신하지 못합니다. 저는 주로 InnoDb과 함께 일하는데 이것은 적어도 InnoDb을 사용하여 쿼리 성능을 향상시키는 것입니다.