2012-10-17 2 views
11

나는 MySQL의 특징으로 다이빙 점점 더 깊이있어, 기본적으로 내가 명확한 답을 찾을 수 없습니다 그들에 대해 단 하나 개의 질문있다파티션 및 UPDATE

내가 밖으로 노력하고있어 다음 하나는 테이블 파티션입니다 아직 :

행을 업데이트하면 다른 파티션의 파티션 조건이 충족되면 행이 다른 파티션으로 자동 이동됩니까? (예를 들어 파티션이 영역별로 나뉘며 영역이 영역 A에서 영역 B로 변경되는 경우)

그리고 자동으로 발생하지 않으면 행을 이동하기 위해 수행해야 할 작업은 무엇입니까? 파티션 A에서 파티션 B로 파티션 하시겠습니까? (그렇게하면 성능이 떨어질까요?)

나는 '삭제 된'(플래그) 정보를 테이블의 별도 파티션으로 이동시키는 경우가 거의 없습니다. 그게 보통 좋은 생각일까요 아니면 그냥 언젠가 (아마 언젠가 거대한 - 수백만 행) 테이블에 모든 것을 남겨 두는 것이 낫겠습니까?

답변

17

업데이트시 이동해야합니다. 그렇지 않은 경우 잘 작동하지 않습니다. MySQL은 기본적으로 모든 쿼리의 모든 파티션을 스캔해야하는데, 그 이유는 저장된 레코드가 어디에 있는지를 알 수 없기 때문입니다.

I도했다 (MySQL의 5.6에 그게 쿼리 무엇의 칸막이 지정할 수의 첫 번째 버전의로) 몇 가지 테스트

CREATE TABLE test (
    id int 
) 
PARTITION BY RANGE (id) (
    PARTITION p1 VALUES LESS THAN (1000), 
    PARTITION p2 VALUES LESS THAN MAXVALUE); 

INSERT INTO test VALUES (1); -- now on partition p1 

SELECT * FROM test PARTITION(p1); 
+------+ 
| id | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 

SELECT * FROM test PARTITION(p2); 
Empty set (0.00 sec) 

UPDATE test SET id = 1001; -- now on partition p2 

SELECT * FROM test PARTITION (p1); 
Empty set (0.00 sec) 

SELECT * FROM test PARTITION (p2); 
+------+ 
| id | 
+------+ 
| 1001 | 
+------+ 
1 row in set (0.00 sec) 

그것이 immediatly 업데이트 후 행이에 지금 알고 분명하다 파티션 p2.

+1

나는 그것이 그 방법으로 작동 할 것이기를 바랬다, 고마워! 난 그저 내가 문서에서 언급 한 것을 볼 수 couldnt 이후 확실하지 않았다. – Katai