2014-01-13 3 views
1

테이블을 분할했습니다 (메모리 부족 오류 - 테이블이 너무 큼). 아래와 같이 나는 타임 스탬프 열을 분할했다 :타임 스탬프에서 MySQL 테이블 파티셔닝

CREATE TABLE test (
    fname VARCHAR(50) NOT NULL, 
    lname VARCHAR(50) NOT NULL, 
    dob timestamp NOT NULL 
) 
PARTITION BY RANGE(unix_timestamp(dob)) (
    PARTITION p2012 VALUES LESS THAN (unix_timestamp('2013-01-01 00:00:00')), 
    PARTITION p2013 VALUES LESS THAN (unix_timestamp('2014-01-01 00:00:00')), 
    PARTITION pNew VALUES LESS THAN MAXVALUE 
); 

내가 분할의 과정은 또한 실행하는 데 몇 시간이 걸릴 whihc 내 쿼리의 몇 가속화에 도움이 될 것으로 기대했다; 그러나이 유형의 파티션은 시작되지 않으며 모든 파티션이 여전히 사용 중이며 쿼리를 통해 스캔됩니다. 나는 시도하고, 부부와 함께, 실패한 더 접근 방법 : Error Code: 1486. Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

2) 준 :

1) 오류의 결과는 것을,

CREATE TABLE t2 (
    fname VARCHAR(50) NOT NULL, 
    lname VARCHAR(50) NOT NULL, 
    region_code TINYINT UNSIGNED NOT NULL, 
    dob timestamp NOT NULL 
) 
PARTITION BY RANGE(YEAR(dob)) (
    PARTITION p2012 VALUES LESS THAN (2013), 
    PARTITION p2013 VALUES LESS THAN (2014), 
    PARTITION pNew VALUES LESS THAN MAXVALUE 
); 

그러나 파티션에 대해 서로 다른 범위를 사용하는 시도 MySQL의 Doc-18.5 Partition Selection에 제안 된대로 다음과 같이 select 문에서 어떤 파티션을 사용할 지 지정하는 시도를했다.

select * from t2 partition (p2012) 

그러나 구문 오류가 반환됩니다. Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(p2012) LIMIT 0, 1000' at line 1

쿼리를 최적화하기 위해 테이블 ​​파티셔닝을 활용할 수있는 다른 방법이 있습니까?

+0

파티션 'p2012'가 실제로 테이블에 있습니까? – hashbrown

+0

사용중인 정확한 MySQL 버전은 무엇입니까? – Mchl

+0

나는 5.1.26을 사용하고있다 – Kate

답변

1
  1. 데이터 유형으로 TIMESTAMP 대신 DATE 또는 DATETIME을 사용하면이 작업을 수행 할 수 있습니다.

    CREATE TABLE t2 (
        fname VARCHAR(50) NOT NULL, 
        lname VARCHAR(50) NOT NULL, 
        region_code TINYINT UNSIGNED NOT NULL, 
        dob DATETIME NOT NULL 
    ) 
    PARTITION BY RANGE(YEAR(dob)) (
        PARTITION p2012 VALUES LESS THAN (2013), 
        PARTITION p2013 VALUES LESS THAN (2014), 
        PARTITION pNew VALUES LESS THAN MAXVALUE 
    ); 
    
  2. 파티션 선택 힌트는 MySQL 5.6 이상에서만 지원됩니다.

    참조 http://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html
    매뉴얼의 페이지는 MySQL 5.6 전용입니다. MySQL 5.5 문서 링크를 클릭하면 5.6으로 다시 연결됩니다.

0

UNIX_TIMESTAMP() 함수를 사용할 수 있습니다. 예제 : MySQL docs :

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL, 
    report_status VARCHAR(20) NOT NULL, 
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 
PARTITION BY RANGE (UNIX_TIMESTAMP(report_updated)) (
    PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-01 00:00:00') ), 
    PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2008-04-01 00:00:00')), 
    PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2008-07-01 00:00:00')), 
    PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2008-10-01 00:00:00')), 
    PARTITION p4 VALUES LESS THAN (UNIX_TIMESTAMP('2009-01-01 00:00:00')), 
    PARTITION p5 VALUES LESS THAN (UNIX_TIMESTAMP('2009-04-01 00:00:00')), 
    PARTITION p6 VALUES LESS THAN (UNIX_TIMESTAMP('2009-07-01 00:00:00')), 
    PARTITION p7 VALUES LESS THAN (UNIX_TIMESTAMP('2009-10-01 00:00:00')), 
    PARTITION p8 VALUES LESS THAN (UNIX_TIMESTAMP('2010-01-01 00:00:00')), 
    PARTITION p9 VALUES LESS THAN (MAXVALUE) 

);

https://dev.mysql.com/doc/refman/5.7/en/partitioning-range.html에서 찾을 수 있습니다.

0

잘못된 것은,이 필드 dob는 고유 한 키가 아닙니다!

CREATE TABLE t2 (
    fname VARCHAR(50) NOT NULL, 
    lname VARCHAR(50) NOT NULL, 
    region_code TINYINT UNSIGNED NOT NULL, 
    dob timestamp NOT NULL, 
    unique 'dob' (dob) 
) 

또는 테이블이 존재한다 :

이 명령을 사용할 수 있습니다

테이블 변경 (T2)는 UNIQUE (DOB)를 추가

당신은 그것을 시도 할 수 있습니다!

관련 문제