2012-06-26 3 views
3

약 40,000 개의 비즈니스에 대해 매주 보는 통계를 저장하는 테이블이 있으며 테이블은 2.2M 레코드를 전달하고 작업 속도를 느리게하기 시작합니다. 작업 속도를 높이기 위해 파티션을보고 있습니다. 하지만 최선을 어떻게해야할지 모르겠다.기본 키 및 concatonated 고유 인덱스가있는 파티션 MySQL 테이블

내 ORM은 기본 키로 id 필드가 필요하지만 해당 필드는 데이터와 관련이 없으며 연도, 주 번호 및 비즈니스 ID 필드에 고유 인덱스를 사용하고 있습니다.

기본 맵을 파티션 맵에 포함시켜야하므로 기본 구성 방법을 잘 모릅니다.

현재 내가 가지고있는

... 일주일에

CREATE TABLE `weekly_views` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `business_id` int(11) NOT NULL, 
    `year` smallint(4) UNSIGNED NOT NULL, 
    `week` tinyint(2) UNSIGNED NOT NULL, 
    `hits` int(5) NOT NULL, 
    `created` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    UNIQUE `search` USING BTREE (business_id, `year`, `week`), 
    UNIQUE `id` USING BTREE (id, `week`) 
) ENGINE=`InnoDB` AUTO_INCREMENT=2287009 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ROW_FORMAT=COMPACT CHECKSUM=0 DELAY_KEY_WRITE=0 PARTITION BY LIST(week) PARTITIONS 52 (PARTITION p1 VALUES IN (1) ENGINE = InnoDB, 
PARTITION p2 VALUES IN (2) ENGINE = InnoDB, 
PARTITION p3 VALUES IN (3) ENGINE = InnoDB, 
PARTITION p4 VALUES IN (4) ENGINE = InnoDB, 
(5 ... 51) 
PARTITION p52 VALUES IN (52) ENGINE = InnoDB); 

하나 개의 파티션을 나눌 수있는 유일한 논리적 인 방법을 보였다. 내가 'business_id = xx and week = xx and year = xx'를 사용하여 현재 주/비즈니스에 대한 레코드를 검색하면 모두 검색하지 않고 사용할 파티션을 알 수 있습니다. 그러나 결과를 얻고 ORM을 통해 저장하면 id 필드를 사용하고 사용할 파티션을 알지 못합니다.

사용자 지정 쿼리를 사용하여 삽입하거나 업데이트 할 수 있다고 생각합니다. 원래 ORM이 지원하지 않으므로이 작업을 수행하지 않았습니다.

나는 이것에 대해 올바른 방법을 사용하고 있습니까? 아니면 이와 같은 테이블을 파티션하는 더 좋은 방법이 있습니까?

도움 주셔서 감사합니다.

+0

파티션은 내부 메커니즘이므로 삽입/업데이트 쿼리를 걱정하거나 변경할 필요가 없습니다. – georgecj11

답변

0

열이 WHERE 절에있는 한 MySQL은 올바른 파티션을 찾습니다. 그러나 매년 몇 주가 반복되며 동일한 파티션에서 서로 다른 연도의 데이터로 끝납니다.

윤년을 처리해야하므로 52 개의 파티션이 아니라 53 개의 파티션이 필요합니다.