2011-11-03 4 views
1

파티션에 사용한 타임 스탬프 열이있는 'fvs_data'테이블이 있습니다. 복잡한 쿼리가있을 경우 쿼리 최적화 프로그램이 올바른 파티션을 선택하지 않는 것 같습니다. , p_2011_44 TO_DAYS 사람 ('2011-11-02') = 734,808 : 예를 들어,이 쿼리MySQL 파티션 선택이 올바르게 최적화되지 않았습니다.

EXPLAIN PARTITIONS SELECT * FROM `fvs_data` WHERE `timestamp` = '2011-11-02' 

는 격벽리스트보기와 같이 정확한 분할을 이용한다.

는 그러나 동일한 파티션을 반환해야 다른 조건을 추가하는 경우, 그것은 다른 파티션

파티션 목록 p_2011_42, p_2011_44을 반환
EXPLAIN PARTITIONS SELECT * FROM `fvs_data` WHERE `timestamp` > '2011-11-01' AND `timestamp` < '2011-11-03' 

중 하나 확인하고 싶어. 여기 내

CREATE TABLE `fvs_data` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`fvs_client_id` int(11) NOT NULL, 
`timestamp` datetime NOT NULL, 
`setupid` char(20) NOT NULL, 
`assyline` char(20) NOT NULL, 
`machine` char(20) NOT NULL, 
`side` char(20) NOT NULL, 
`module` char(20) NOT NULL, 
`fixtureid` char(20) NOT NULL, 
`fixturepos` char(20) NOT NULL, 
`feedpos` char(20) NOT NULL, 
`partnum` char(20) NOT NULL, 
`vendor` char(20) NOT NULL, 
`tid` char(20) NOT NULL, 
`quant` char(20) NOT NULL, 
`status` char(32) NOT NULL, 
`oper` char(20) NOT NULL, 
`lane1` char(20) NOT NULL, 
`lane2` char(20) NOT NULL, 
`sn` char(20) NOT NULL, 
`totalcomp` char(20) NOT NULL, 
PRIMARY KEY (`id`,`timestamp`), 
KEY `fvs_client_id` (`fvs_client_id`), 
KEY `setupid` (`setupid`), 
KEY `assyline` (`assyline`), 
KEY `machine` (`machine`), 
KEY `side` (`side`), 
KEY `module` (`module`), 
KEY `fixtureid` (`fixtureid`), 
KEY `fixturepos` (`fixturepos`), 
KEY `feedpos` (`feedpos`), 
KEY `partnum` (`partnum`), 
KEY `vendor` (`vendor`), 
KEY `tid` (`tid`), 
KEY `status` (`status`), 
KEY `oper` (`oper`), 
KEY `lane1` (`lane1`), 
KEY `lane2` (`lane2`), 
KEY `sn` (`sn`) 
) ENGINE=MyISAM AUTO_INCREMENT=36032 DEFAULT CHARSET=latin1 
/*!50100 PARTITION BY RANGE (TO_DAYS(timestamp)) 
(PARTITION p_2011_42 VALUES LESS THAN (734796) ENGINE = MyISAM, 
PARTITION p_2011_43 VALUES LESS THAN (734803) ENGINE = MyISAM, 
PARTITION p_2011_44 VALUES LESS THAN (734810) ENGINE = MyISAM, 
PARTITION p_2011_45 VALUES LESS THAN (734817) ENGINE = MyISAM) */ 

내가 주 파티션을하려고하지만, 일요일로 시작하는 실제 주에 기반하고 있지 않다 CREATE TABLE 구문이다, 난 그냥 7 년의 일을 나누어 파티션 이름을 만들 것을 사용 .

답변

0

파티션 정리는 검색중인 값에 관계없이 항상 첫 번째 파티션을 검사합니다. 이것은 분할 방법 stores NULLs in the first partition과 관련이 있습니다.

적은 어떤 것보다 값의 초기 파티션을 생성,이 문제를 해결하고 범위 분할을 최적화하는 것 일반적으로 가기 :

첫 번째 파티션이 비어 있도록 타임 스탬프 열이 NULL 아닙니다 물론
... 
PARTITION BY RANGE (TO_DAYS(timestamp)) 
(
PARTITION p_0000 VALUES LESS THAN (0) ENGINE = MyISAM, -- NULLs end up here 
PARTITION p_2011_42 VALUES LESS THAN (734796) ENGINE = MyISAM, 
PARTITION p_2011_43 VALUES LESS THAN (734803) ENGINE = MyISAM, 
PARTITION p_2011_44 VALUES LESS THAN (734810) ENGINE = MyISAM, 
PARTITION p_2011_45 VALUES LESS THAN (734817) ENGINE = MyISAM 
PARTITION p_MAX VALUES LESS THAN MAXVALUE ENGINE = MyISAM 
) 

하고, 따라서 매우 빠르게 검색 할 수 있습니다.

P .: 다른 파티션의 범위를 벗어나는 큰 값을 잡으려면 파티션을 추가해야합니다. 그렇지 않으면 그러한 행을 삽입하면 실패합니다.

+0

감사합니다. 내 소프트웨어는 실제로 새로운 파티션을 동적으로 추가하여 다음 주 데이터의 파티션이 데이터가 있기 전에 항상 준비되도록합니다. 또한 일부 데이터 제한보다 오래된 파티션을 프 루닝합니다. – Matt

+0

이해하지만, 잘못된 값이 삽입 될 경우를 대비하여 MAXVALUE 파티션을 유지하는 것을 선호합니다. 어쩌면 당신은 그것을 실패하기를 원할 것입니다, 아마 당신은 성공하기를 원할 것입니다. –

관련 문제