함수 - mysql 시간 비교




datetime 열에 의해 테이블을 분할하는 방법? (3)

방금 최근에 http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html 에서 MySQL 블로그 게시물을 읽었습니다.

5.1 이전 버전에서는 날짜를 기준으로 파티셔닝을하기 위해 특수 체조가 필요했습니다. 위의 링크는 그것을 논의하고 예제를 보여줍니다.

버전 5.5 이상에서는 날짜 및 문자열과 같은 숫자가 아닌 값을 사용하여 직접 파티셔닝 할 수있었습니다.

datetime 열에 의해 MySQL 테이블을 분할하고 싶습니다. 하루는 파티션. create table scripts는 다음과 같습니다 :

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
PARTITION BY hash (day(ftime)) partitions 31;

하지만 하루의 데이터를 선택할 때 파티션을 찾을 수 없습니다. select 문은 다음과 같습니다.

explain partitions select * from raw_log_2011_4 where day(ftime) = 30;

다른 문을 사용하면 파티션을 찾을 수 있지만 언젠가는 데이터를 선택하지 않습니다.

explain partitions select * from raw_log_2011_4 where ftime = '2011-03-30';

아무도 말해 줄 수있는 방법 내가 언젠가는 데이터를 선택하고 파티션을 사용하는 방법. 감사합니다!


안녕 당신은 테이블 정의에서 다음과 같은 테이블의 정의에서 잘못된 파티션을하고 있습니다 :

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
PARTITION BY hash (TO_DAYS(ftime)) partitions 31;

그리고 당신의 선택 명령은 :

explain partitions 
    select * from raw_log_2011_4 where TO_DAYS(ftime) = '2011-03-30';

위의 명령은 TO_DAYS 명령을 다음과 같이 사용하는 것처럼 필요한 모든 날짜를 선택합니다.

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('2007-10-07');
        -> 733321

TO_DAYS AS를 사용해야하는 이유 MySQL 최적화 프로그램은 파티션 정리 목적으로 두 가지 날짜 기반 함수를 인식합니다 : 1.TO_DAYS () 2.YEAR ()

그리고이 귀하의 문제를 해결할 것입니다 ..


CHAR 을 사용하지 마십시오. VARCHAR 사용하십시오. 이렇게하면 많은 공간을 절약 할 수 있으므로 I / O가 감소하므로 쿼리가 빨라집니다.

reporterip : (46)은 IPv6조차도 IP 주소에 대해 불필요하게 커집니다. 16 바이트로 축소하는 방법을 포함하여 자세한 내용은 내 블로그 를 참조하십시오.

@Steyx가 제안한 바와 같이 범위별로 분할 PARTITION BY RANGE(TO_DAYS(...)) 하지만 약 50 개 이상의 분할 영역이 없습니다. 파티션이 많을수록 "제거 (pruning)"에도 불구하고 쿼리 속도가 느려집니다. HASH 파티셔닝은 본질적으로 쓸모가 없습니다.

파티셔닝에 대한 더 많은 논의, 특히 당신이보고있는 타입 . 여기에는 시간이 지남에 따라 슬라이딩 파티션 집합에 대한 코드가 포함됩니다.





database-partitioning