ã51CTOç»å ¸è¯æãMySQL 5.5çåå¸å¸¦æ¥äºè®¸å¤å¢å¼ºçåè½ï¼è½ç¶å·²ç»æ¥éäºå¾å¤å¢å¼ºåè½ï¼å¦ååæ¥å¤å¶ï¼ä½å¤§å®¶å´å¿½ç¥äºååºæ¹é¢çå¢å¼ºï¼ææ¶çè³è¿å¯¹å ¶çæ£æä¹äº§çäºè¯¯è§£ï¼å¨è¿ç¯æç« ä¸ï¼æ们å¸æ解éä¸ä¸è¿äºå¾é ·çå¢å¼ºï¼ç¹å«æ¯æ们大å¤æ°äººè¿æ²¡æå®å ¨ç解çå°æ¹ã51CTOåæ¨æ¨èãMySQLæ°æ®åºå ¥é¨ä¸ç²¾éæç¨ãã
å¾ 1 大家è¿æ²¡æ³¨æå°æMySQLçååºåè½ä¹å¾å¼ºäºå¦
éæ´æ°åååº
ä»»ä½ä½¿ç¨è¿ååºç人åºè¯¥é½éå°è¿ä¸å°é®é¢ï¼ç¹å«æ¯é¢å¯¹éæ´æ°åååºæ¶ï¼MySQL 5.1åªè½å¤çæ´æ°åååºï¼å¦æä½ æ³å¨æ¥ææå符串åä¸è¿è¡ååºï¼ä½ ä¸å¾ä¸ä½¿ç¨å½æ°å¯¹å ¶è¿è¡è½¬æ¢ã
MySQL 5.5ä¸æ°å¢äºä¸¤ç±»ååºæ¹æ³ï¼RANGåLISTååºæ³ï¼åæ¶å¨æ°çå½æ°ä¸å¢å äºä¸ä¸ªCOLUMNSå ³é®è¯ãæ们å设æè¿æ ·ä¸ä¸ªè¡¨ï¼
CREATE TABLE expenses (    expense_date DATE NOT NULL,    category VARCHAR(30),    amount DECIMAL (10,3)  );
å¦æä½ æ³ä½¿ç¨MySQL 5.1ä¸çååºç±»åï¼é£ä½ å¿ é¡»å°ç±»å转æ¢ææ´æ°ï¼éè¦ä½¿ç¨ä¸ä¸ªé¢å¤çæ¥æ¾è¡¨ï¼å°äºMySQL 5.5ä¸ï¼ä½ å¯ä»¥ä¸ç¨åè¿è¡ç±»å转æ¢äºï¼å¦ï¼
ALTER TABLE expenses  PARTITION BY LIST COLUMNS (category)  (    PARTITION p01 VALUES IN ( 'lodging', 'food'),    PARTITION p02 VALUES IN ( 'flights', 'ground transportation'),    PARTITION p03 VALUES IN ( 'leisure', 'customer entertainment'),    PARTITION p04 VALUES IN ( 'communications'),    PARTITION p05 VALUES IN ( 'fees')  );
è¿æ ·çååºè¯å¥é¤äºæ´å æ读å¤ï¼å¯¹æ°æ®çç»ç»å管çä¹éå¸¸æ¸ æ°ï¼ä¸é¢çä¾ååªå¯¹categoryåè¿è¡ååºã
å¨MySQL 5.1ä¸ä½¿ç¨ååºå¦ä¸ä¸ªè®©äººå¤´ççé®é¢æ¯dateç±»åï¼å³æ¥æåï¼ï¼ä½ ä¸è½ç´æ¥ä½¿ç¨å®ä»¬ï¼å¿ 须使ç¨YEARæTO_DAYS转æ¢è¿äºåï¼å¦ï¼
/* å¨MySQL 5.1ä¸*/  CREATE TABLE t2  (    dt DATE )  PARTITION BY RANGE (TO_DAYS(dt))  (    PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')),    PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')),    PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')),    PARTITION p04 VALUES LESS THAN (MAXVALUE));   SHOW CREATE TABLE t2 \G  *************************** 1. row ***************************         Table: t2  Create Table: CREATE TABLE `t2` (    `dt` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1  /*!50100 PARTITION BY RANGE (TO_DAYS(dt))  (PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,   PARTITION p02 VALUES LESS THAN (733407) ENGINE = MyISAM,   PARTITION p03 VALUES LESS THAN (733773) ENGINE = MyISAM,   PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
çä¸å»é常ç³ç³ï¼å½ç¶ä¹æåéåæ³ï¼ä½éº»ç¦ç¡®å®ä¸å°ã使ç¨YEARæTO_DAYSå®ä¹ä¸ä¸ªååºç确让人费解ï¼æ¥è¯¢æ¶ä¸å¾ä¸ä½¿ç¨èµ¤è£¸åï¼å 为å äºå½æ°çæ¥è¯¢ä¸è½è¯å«ååºã
ä½å¨MySQL 5.5ä¸æ åµåçäºå¾å¤§çååï¼ç°å¨å¨æ¥æåä¸å¯ä»¥ç´æ¥ååºï¼å¹¶ä¸æ¹æ³ä¹å¾ç®åã
/*å¨MySQL 5.5ä¸*/  CREATE TABLE t2  (    dt DATE )  PARTITION BY RANGE COLUMNS (dt)  (    PARTITION p01 VALUES LESS THAN ('2007-01-01'),    PARTITION p02 VALUES LESS THAN ('2008-01-01'),    PARTITION p03 VALUES LESS THAN ('2009-01-01'),    PARTITION p04 VALUES LESS THAN (MAXVALUE));   SHOW CREATE TABLE t2 \G  *************************** 1. row ***************************         Table: t2  Create Table: CREATE TABLE `t2` (    `dt` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1  /*!50500 PARTITION BY RANGE  COLUMNS(dt)  (PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,   PARTITION p02 VALUES LESS THAN ('2008-01-01') ENGINE = MyISAM,   PARTITION p03 VALUES LESS THAN ('2009-01-01') ENGINE = MyISAM,   PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */
å¨è¿éï¼éè¿å½æ°å®ä¹åéè¿åæ¥è¯¢ä¹é´æ²¡æå²çªï¼å 为æ¯æåå®ä¹çï¼æ们å¨å®ä¹ä¸æå ¥çå¼æ¯ä¿ççã
å¤åååº
COLUMNSå ³é®åç°å¨å 许å符串åæ¥æåä½ä¸ºååºå®ä¹åï¼åæ¶è¿å 许使ç¨å¤ä¸ªåå®ä¹ä¸ä¸ªååºï¼ä½ å¯è½å¨å®æ¹ææ¡£ä¸å·²ç»çå°äºä¸äºä¾åï¼å¦ï¼Â
CREATE TABLE p1 (    a INT,    b INT,    c INT )  PARTITION BY RANGE COLUMNS (a,b)  (    PARTITION p01 VALUES LESS THAN (10,20),    PARTITION p02 VALUES LESS THAN (20,30),    PARTITION p03 VALUES LESS THAN (30,40),    PARTITION p04 VALUES LESS THAN (40,MAXVALUE),    PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)  );   CREATE TABLE p2 (    a INT,    b INT,    c INT )  PARTITION BY RANGE COLUMNS (a,b)  (    PARTITION p01 VALUES LESS THAN (10,10),    PARTITION p02 VALUES LESS THAN (10,20),    PARTITION p03 VALUES LESS THAN (10,30),    PARTITION p04 VALUES LESS THAN (10,MAXVALUE),    PARTITION p05 VALUES LESS THAN (MAXVALUE,MAXVALUE)  )
åæ ·è¿æPARTITION BY RANGE COLUMNS (a,b,c)çå ¶å®ä¾åãç±äºæå¾é¿æ¶é´é½å¨ä½¿ç¨MySQL 5.1çååºï¼æ对å¤åååºçå«ä¹ä¸å¤ªäºè§£ï¼LESS THAN (10,10)æ¯ä»ä¹ææï¼å¦æä¸ä¸ä¸ªååºæ¯LESS THAN (10,20)ä¼åçä»ä¹ï¼ç¸åï¼å¦ææ¯(20,30)åä¼å¦ä½ï¼
ææè¿äºé®é¢é½éè¦ä¸ä¸ªçæ¡ï¼å¨åçä¹åï¼ä»ä»¬éè¦æ´å¥½å°ç解æ们å¨åä»ä¹ã
å¼å§æ¶å¯è½æäºæ··ä¹±ï¼å½ææååºæä¸ä¸ªä¸åèå´çå¼æ¶ï¼å®é ä¸ï¼å®åªæ¯å¨è¡¨çä¸ä¸ªåä¸è¿è¡äºååºï¼ä½äºå®å¹¶éå¦æ¤ï¼å¨ä¸é¢çä¾åä¸ï¼
CREATE TABLE p1_single (    a INT,    b INT,    c INT )  PARTITION BY RANGE COLUMNS (a)  (    PARTITION p01 VALUES LESS THAN (10),    PARTITION p02 VALUES LESS THAN (20),    PARTITION p03 VALUES LESS THAN (30),    PARTITION p04 VALUES LESS THAN (40),    PARTITION p05 VALUES LESS THAN (MAXVALUE)  );
å®ååé¢ç表p1ä¸ä¸æ ·ï¼å¦æä½ å¨è¡¨p1ä¸æå ¥ï¼10,1,1ï¼ï¼å®å°ä¼è¿å ¥ç¬¬ä¸ä¸ªååºï¼ç¸åï¼å¨è¡¨p1_singleä¸ï¼å®å°ä¼è¿å ¥ç¬¬äºä¸ªååºï¼å ¶åå æ¯(10,1)å°äº(10,10)ï¼å¦æä½ ä» ä» å ³æ³¨ç¬¬ä¸ä¸ªå¼ï¼ä½ è¿æ²¡ææè¯å°ä½ å¨æ¯è¾ä¸ä¸ªå ç»ï¼èä¸æ¯ä¸ä¸ªåä¸çå¼ã
ç°å¨æ们æ¥åæä¸ä¸æé¾æçå°æ¹ï¼å½ä½ éè¦ç¡®å®æä¸è¡åºè¯¥æ¾å¨åªéæ¶ä¼åçä»ä¹ï¼ä½ æ¯å¦ä½ç¡®å®ç±»ä¼¼(10,9) < (10,10)è¿ç§è¿ç®çå¼çï¼çæ¡å ¶å®å¾ç®åï¼å½ä½ 对å®ä»¬è¿è¡æåºæ¶ï¼ä½¿ç¨ç¸åçæ¹æ³è®¡ç®ä¸¤æ¡è®°å½çå¼ã
a=10  b=9  (a,b) < (10,10) ?   # evaluates to:   (a < 10)  OR ((a = 10) AND ( b < 10))   # which translates to:   (10 < 10)  OR ((10 = 10) AND ( 9 < 10))
å¦ææä¸åï¼è¡¨è¾¾å¼ä¼æ´é¿ï¼ä½ä¸ä¼æ´å¤æãä½ é¦å å¨ç¬¬ä¸ä¸ªé¡¹ç®ä¸æµè¯å°äºè¿ç®ï¼å¦ææ两个ææ´å¤çååºä¸ä¹å¹é ï¼æ¥çå°±æµè¯ç¬¬äºä¸ªé¡¹ç®ï¼å¦æä¸æ¢ä¸ä¸ªåéååºï¼é£è¿éè¦æµè¯ç¬¬ä¸ä¸ªé¡¹ç®ã
ä¸å¾ææ¾ç¤ºçå 容表示å°éåä¸æ¡è®°å½æå ¥å°ä½¿ç¨ä»¥ä¸ä»£ç å®ä¹çååºä¸ï¼
(10,10),
(10,20),
(10,30),
(10, MAXVALUE)
å¾ 2 å ç»æ¯è¾ãå½ç¬¬ä¸ä¸ªå¼å°äºååºå®ä¹ç第ä¸ä¸ªèå´æ¶ï¼é£ä¹è¯¥è¡å°å±äºè¿éäºã
å¾ 3 å ç»æ¯è¾ãå½ç¬¬ä¸ä¸ªå¼çäºååºå®ä¹ç第ä¸ä¸ªèå´ï¼æ们éè¦æ¯è¾ç¬¬äºä¸ªé¡¹ç®ï¼å¦æå®å°äºç¬¬äºä¸ªèå´ï¼é£ä¹è¯¥è¡å°å±äºè¿éäºã
å¾ 4 å ç»æ¯è¾ãå½ç¬¬ä¸ä¸ªå¼å第äºä¸ªå¼çäºä»ä»¬å¯¹åºçèå´æ¶ï¼å¦æå ç»ä¸å°äºå®ä¹çèå´ï¼é£ä¹å®å°±ä¸å±äºè¿éï¼ç»§ç»ä¸ä¸æ¥ã
å¾ 5 å ç»æ¯è¾ãå¨ä¸ä¸ä¸ªèå´æ¶ï¼ç¬¬ä¸ä¸ªé¡¹ç®æ¯çäºï¼ç¬¬äºä¸ªé¡¹ç®æ¯å°äºï¼å æ¤å ç»æ´å°ï¼é£ä¹è¯¥è¡å°±å±äºè¿éäºã
å¨è¿äºå¾ç帮å©ä¸ï¼æ们对æå ¥ä¸æ¡è®°å½å°å¤åååºè¡¨çæ¥éª¤æäºæ´æ·±çäºè§£ï¼è¿äºé½æ¯ç论ä¸çï¼ä¸ºäºå¸®å©ä½ æ´å¥½å°ææ¡æ°åè½ï¼æ们åæ¥çä¸ä¸ªæ´é«çº§ä¸ç¹çä¾åï¼å¯¹äºæ¯è¾å¡å®ç读è æ´ææä¹ï¼ä¸é¢æ¯è¡¨çå®ä¹èæ¬ï¼
CREATE TABLE employees (    emp_no int(11) NOT NULL,    birth_date date NOT NULL,    first_name varchar(14) NOT NULL,    last_name varchar(16) NOT NULL,    gender char(1) DEFAULT NULL,    hire_date date NOT NULL ) ENGINE=MyISAM  PARTITION BY RANGE  COLUMNS(gender,hire_date)  (PARTITION p01 VALUES LESS THAN ('F','1990-01-01') ,   PARTITION p02 VALUES LESS THAN ('F','2000-01-01') ,   PARTITION p03 VALUES LESS THAN ('F',MAXVALUE) ,   PARTITION p04 VALUES LESS THAN ('M','1990-01-01') ,   PARTITION p05 VALUES LESS THAN ('M','2000-01-01') ,   PARTITION p06 VALUES LESS THAN ('M',MAXVALUE) ,   PARTITION p07 VALUES LESS THAN (MAXVALUE,MAXVALUE)
åä¸é¢çä¾åä¸åï¼è¿ä¸ªä¾åæ´å¥½ç解ï¼ç¬¬ä¸ä¸ªååºç¨æ¥åå¨éä½£äº1990年以åç女èåï¼ç¬¬äºä¸ªååºåå¨è¡ç¨äº1990-2000å¹´ä¹é´ç女èåï¼ç¬¬ä¸ä¸ªååºåå¨ææå©ä¸ç女èåã对äºååºp04å°p06ï¼æ们çç¥æ¯ä¸æ ·çï¼åªä¸è¿åå¨çæ¯ç·èåãæåä¸ä¸ªååºæ¯æ§å¶æ åµã
çå®åä½ å¯è½è¦é®ï¼ææä¹ç¥éæä¸è¡åå¨å¨é£ä¸ªååºä¸çï¼æ两个åæ³ï¼ç¬¬ä¸ä¸ªåæ³æ¯ä½¿ç¨ä¸ååºå®ä¹ç¸åçæ¡ä»¶ä½ä¸ºæ¥è¯¢æ¡ä»¶è¿è¡æ¥è¯¢ã
SELECT CASE   WHEN gender = 'F' AND hire_date < '1990-01-01'   THEN 'p1'   WHEN gender = 'F' AND hire_date < '2000-01-01'   THEN 'p2'   WHEN gender = 'F' AND hire_date < '2999-01-01'   THEN 'p3'   WHEN gender = 'M' AND hire_date < '1990-01-01'   THEN 'p4'   WHEN gender = 'M' AND hire_date < '2000-01-01'   THEN 'p5'   WHEN gender = 'M' AND hire_date < '2999-01-01'   THEN 'p6' ELSE   'p7' END as p,  COUNT(*) AS rows FROM employees  GROUP BY p;   +------+-------+  | p    | rows  |  +------+-------+  | p1   | 66212 |  | p2   | 53832 |  | p3   |     7 |  | p4   | 98585 |  | p5   | 81382 |  | p6   |     6 |  +------+-------+
å¦æ表æ¯MyISAMæARCHIVEï¼ä½ å¯ä»¥ä¿¡ä»»ç±INFORMATION_SCHEMAæä¾çç»è®¡ä¿¡æ¯ãÂ
SELECT   partition_name part,    partition_expression expr,    partition_description descr,    table_rows  FROM   INFORMATION_SCHEMA.partitions  WHERE   TABLE_SCHEMA = schema()    AND TABLE_NAME='employees';  +------+------------------+-------------------+------------+  | part | expr             | descr             | table_rows |  +------+------------------+-------------------+------------+  | p01  | gender,hire_date | 'F','1990-01-01'  |      66212 |  | p02  | gender,hire_date | 'F','2000-01-01'  |      53832 |  | p03  | gender,hire_date | 'F',MAXVALUE      |          7 |  | p04  | gender,hire_date | 'M','1990-01-01'  |      98585 |  | p05  | gender,hire_date | 'M','2000-01-01'  |      81382 |  | p06  | gender,hire_date | 'M',MAXVALUE      |          6 |  | p07  | gender,hire_date | MAXVALUE,MAXVALUE |          0 |  +------+------------------+-------------------+------------+
å¦æåå¨å¼ææ¯InnoDBï¼ä¸é¢çå¼å°±æ¯ä¸ä¸ªè¿ä¼¼å¼ï¼å¦æä½ éè¦ç¡®åçå¼ï¼é£ä½ å°±ä¸è½ä¿¡ä»»å®ä»¬ã
å¦ä¸ä¸ªé®é¢æ¯å®çæ§è½ï¼è¿äºå¢å¼ºè§¦åäºååºä¿®æ´åï¼çæ¡æ¯«ä¸å«ç³ï¼æ¯çãä¸MySQL 5.1ææä¸åï¼å¨5.1ä¸æ¥æååºåªè½ä¸ä¸¤ä¸ªå½æ°å·¥ä½ï¼å¨MySQL 5.5ä¸ï¼ä»»ä½ä½¿ç¨äºCOLUMNSå ³é®åå®ä¹çååºé½å¯ä»¥ä½¿ç¨ååºä¿®æ´ï¼ä¸é¢è¿æ¯æµè¯ä¸ä¸å§ã
select count(*) from employees where gender='F' and hire_date < '1990-01-01';  +----------+  | count(*) |  +----------+  |    66212 |  +----------+  1 row in set (0.05 sec)   explain partitions select count(*) from employees where gender='F' and hire_date < '1990-01-01'\G  *************************** 1. row ***************************             id: 1    select_type: SIMPLE          table: employees     partitions: p01           type: ALL possible_keys: NULL           key: NULL       key_len: NULL           ref: NULL          rows: 300024          Extra: Using where
使ç¨å®ä¹ç¬¬ä¸ä¸ªååºçæ¡ä»¶ï¼æ们è·å¾äºä¸ä¸ªé常ä¼åçæ¥è¯¢ï¼ä¸ä» å¦æ¤ï¼é¨åæ¡ä»¶ä¹å°ä»ååºä¿®æ´ä¸åçã
select count(*) from employees where gender='F';  +----------+  | count(*) |  +----------+  |   120051 |  +----------+  1 row in set (0.12 sec)   explain partitions select count(*) from employees where gender='F'\G  *************************** 1. row ***************************             id: 1    select_type: SIMPLE          table: employees     partitions: p01,p02,p03,p04           type: ALL possible_keys: NULL           key: NULL       key_len: NULL           ref: NULL          rows: 300024          Extra: Using where
å®åå¤åç´¢å¼çç®æ³ä¸æ ·ï¼å¦æä½ çæ¡ä»¶æçæ¯ç´¢å¼æ左边çé¨åï¼MySQLå°ä¼ä½¿ç¨å®ãä¸æ¤ç±»ä¼¼ï¼å¦æä½ çæ¡ä»¶æçæ¯ååºå®ä¹æ左边çé¨åï¼MySQLå°ä¼å°½å¯è½ä¿®æ´ãå®åå¤åç´¢å¼ä¸èµ·åºç°ï¼å¦æä½ åªä½¿ç¨æå³è¾¹çæ¡ä»¶ï¼ååºä¿®æ´ä¸ä¼å·¥ä½ã
select count(*) from employees where hire_date < '1990-01-01';  +----------+  | count(*) |  +----------+  |   164797 |  +----------+  1 row in set (0.18 sec)   explain partitions select count(*) from employees where hire_date < '1990-01-01'\G  *************************** 1. row ***************************             id: 1    select_type: SIMPLE          table: employees     partitions: p01,p02,p03,p04,p05,p06,p07           type: ALL possible_keys: NULL           key: NULL       key_len: NULL           ref: NULL          rows: 300024          Extra: Using where
å¦æä¸ç¨ååºå®ä¹ç第ä¸é¨åï¼ä½¿ç¨ååºå®ä¹ç第äºé¨åï¼é£ä¹å°ä¼åçå ¨è¡¨æ«æï¼å¨è®¾è®¡ååºåç¼åæ¥è¯¢æ¶è¦ç´§è®°è¿ä¸æ¡ã
å¯ç¨æ§å¢å¼ºï¼truncateååº
ååºæå¸å¼äººçä¸ä¸ªåè½æ¯ç¬é´ç§»é¤å¤§éè®°å½çè½åï¼DBAé½å欢å°åå²è®°å½åå¨å°ææ¥æååºçååºè¡¨ä¸ï¼è¿æ ·å¯ä»¥å®æå é¤è¿æ¶çåå²æ°æ®ï¼è¿ç§æ¹æ³ç¸å½ç®¡ç¨ï¼å设第ä¸ä¸ªååºåå¨çæ¯ææ§çåå²è®°å½ï¼é£ä¹ä½ å¯ä»¥ç´æ¥å é¤ç¬¬ä¸ä¸ªååºï¼ç¶ååå¨æ«å°¾å»ºç«ä¸ä¸ªæ°ååºä¿åæè¿çåå²è®°å½ï¼è¿æ ·å¾ªç¯ä¸å»å°±å¯ä»¥å®ç°åå²è®°å½çå¿«éæ¸ é¤ã
ä½å½ä½ éè¦ç§»é¤ååºä¸çé¨åæ°æ®æ¶ï¼äºæ å°±ä¸æ¯é£ä¹ç®åäºï¼å é¤ååºæ²¡æé®é¢ï¼ä½å¦ææ¯æ¸ 空ååºï¼å°±å¾å¤´çäºï¼è¦ç§»é¤ååºä¸çæææ°æ®ï¼ä½éè¦ä¿çååºæ¬èº«ï¼ä½ å¯ä»¥ï¼
使ç¨DELETEè¯å¥ï¼ä½æ们ç¥éDELETEè¯å¥çæ§è½é½å¾å·®ã
使ç¨DROP PARTITIONè¯å¥ï¼ç´§è·çä¸ä¸ªEORGANIZE PARTITIONSè¯å¥éæ°å建ååºï¼ä½è¿æ ·åæ¯åä¸ä¸ªæ¹æ³çææ¬è¦é«åºè®¸å¤ã
MySQL 5.5å¼å ¥äºTRUNCATE PARTITIONï¼å®åDROP PARTITIONè¯å¥æäºç±»ä¼¼ï¼ä½å®ä¿çäºååºæ¬èº«ï¼ä¹å°±æ¯è¯´ååºè¿å¯ä»¥éå¤å©ç¨ãTRUNCATE PARTITIONåºè¯¥æ¯DBAå·¥å ·ç®±ä¸çå¿ å¤å·¥å ·ã
æ´å¤å¾®è°åè½ï¼TO_SECONDS
ååºå¢å¼ºå æä¸ä¸ªæ°çå½æ°å¤çDATEåDATETIMEåï¼ä½¿ç¨TO_SECONDSå½æ°ï¼ä½ å¯ä»¥å°æ¥æ/æ¶é´å转æ¢æèª0年以æ¥çç§æ°ï¼å¦æä½ æ³ä½¿ç¨å°äº1天çé´éè¿è¡ååºï¼é£ä¹è¿ä¸ªå½æ°å°±å¯ä»¥å¸®å°ä½ ã
TO_SECONDSä¼è§¦åååºä¿®æ´ï¼ä¸TO_DAYSä¸åï¼å®å¯ä»¥åè¿æ¥ä½¿ç¨ï¼å°±æ¯FROM_DAYSï¼å¯¹äºTO_SECONDS就没æè¿æ ·çååå½æ°äºï¼ä½è¦èªå·±å¨æDIYä¸ä¸ªä¹ä¸æ¯é¾äºã
drop function if exists from_seconds;   delimiter //  create function from_seconds (secs bigint)  returns DATETIME  begin     declare days INT;      declare secs_per_day INT;      DECLARE ZH INT;      DECLARE ZM INT;      DECLARE ZS INT;      set secs_per_day = 60 * 60 * 24;      set days = floor(secs / secs_per_day);      set secs = secs - (secs_per_day * days);      set ZH = floor(secs / 3600);      set ZM = floor(secs / 60) - ZH * 60;      set ZS = secs - (ZH * 3600 + ZM * 60);      return CAST(CONCAT(FROM_DAYS(days), ' ', ZH, ':', ZM, ':', ZS) as DATETIME);  end //   delimiter ;
æäºè¿äºæ°æ¦å¨ï¼æ们å¯ä»¥æææ¡å°å建ä¸ä¸ªå°äº1天ç临æ¶ååºï¼å¦ï¼
CREATE TABLE t2 (    dt datetime  )  PARTITION BY RANGE (to_seconds(dt))  (    PARTITION p01 VALUES LESS THAN (to_seconds('2009-11-30 08:00:00')) ,    PARTITION p02 VALUES LESS THAN (to_seconds('2009-11-30 16:00:00')) ,    PARTITION p03 VALUES LESS THAN (to_seconds('2009-12-01 00:00:00')) ,    PARTITION p04 VALUES LESS THAN (to_seconds('2009-12-01 08:00:00')) ,    PARTITION p05 VALUES LESS THAN (to_seconds('2009-12-01 16:00:00')) ,    PARTITION p06 VALUES LESS THAN (MAXVALUE)  );  show create table t2\G  *************************** 1. row ***************************         Table: t2  Create Table: CREATE TABLE `t2` (    `dt` datetime DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1  /*!50500 PARTITION BY RANGE (to_seconds(dt))  (PARTITION p01 VALUES LESS THAN (63426787200) ENGINE = MyISAM,   PARTITION p02 VALUES LESS THAN (63426816000) ENGINE = MyISAM,   PARTITION p03 VALUES LESS THAN (63426844800) ENGINE = MyISAM,   PARTITION p04 VALUES LESS THAN (63426873600) ENGINE = MyISAM,   PARTITION p05 VALUES LESS THAN (63426902400) ENGINE = MyISAM,   PARTITION p06 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
å 为æ们没æ使ç¨COLUMNSå ³é®åï¼æ们ä¹ä¸è½ä½¿ç¨å®ï¼å 为å®ä¸æ¯ææ··åååå½æ°ï¼è¡¨å®ä¹ä¸çè®°å½å¼å°±æ¯TO_SECONDSå½æ°ç计ç®ç»æã
ä½æ们è¿æ¯è¦æè°¢æ°çå½æ°ï¼æ们å¯ä»¥åæ¨è¿ä¸ªå¼ï¼æ¢ç®æä¸ä¸ªæ´å®¹æ读æçæ¥æã
select   partition_name part,    partition_expression expr,    from_seconds(partition_description) descr,    table_rows  FROM INFORMATION_SCHEMA.partitions  WHERE     TABLE_SCHEMA = 'test'     AND TABLE_NAME='t2';  +------+----------------+---------------------+------------+  | part | expr           | descr               | table_rows |  +------+----------------+---------------------+------------+  | p01  | to_seconds(dt) | 2009-11-30 08:00:00 |          0 |  | p02  | to_seconds(dt) | 2009-11-30 16:00:00 |          0 |  | p03  | to_seconds(dt) | 2009-12-01 00:00:00 |          0 |  | p04  | to_seconds(dt) | 2009-12-01 08:00:00 |          0 |  | p05  | to_seconds(dt) | 2009-12-01 16:00:00 |          0 |  | p06  | to_seconds(dt) | 0000-00-00 00:00:00 |          0 |  +------+----------------+---------------------+------------+
æ»ç»
MySQL 5.5对ååºç¨æ·ç»å¯¹æ¯ä¸ªå¥½æ¶æ¯ï¼è½ç¶æ²¡ææä¾ç´æ¥çæ§è½å¢å¼ºçæ¹æ³ï¼å¦æä½ æååºæ¶é´è¯ä¼°æ§è½ï¼ï¼ä½æ´æäºä½¿ç¨çå¢å¼ºåè½ï¼ä»¥åTRUNCATE PARTITIONå½ä»¤é½å¯ä»¥ä¸ºDBAèç大éçæ¶é´ï¼ææ¶å¯¹æç»ç¨æ·äº¦å¦æ¤ã
è¿äºå¢å¼ºçåè½å¯è½ä¼å¨ä¸ä¸ä¸ªéç¨ç¢åå¸æ¶å¾å°æ´æ°ï¼æç»çæ¬é¢è®¡ä¼å¨2010å¹´å¹´ä¸åå¸ï¼å±æ¶ææååºç¨æ·é½å¯ä»¥å°è¯ä¸ä¸ï¼
åæåºå¤ï¼http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html