Mysql時間范圍分區(RANGE COLUMNS方式)


1、創建測試表

CREATE TABLE `t_test` (
    `id` INT (11),
    `dates` DATETIME 
);  
ALTER TABLE t_test ADD PRIMARY KEY (id);
ALTER TABLE t_test MODIFY id INT AUTO_INCREMENT;

2、創建一個生成測試數據的存儲過程

       我這里是生成n條2018年的數據(這個生成的時間有bug、我這里不管了,只是用來測試)

DELIMITER //
CREATE  PROCEDURE `add_vote_memory`(n INT)
BEGIN  
  DECLARE i INT DEFAULT 1;
  DECLARE datess VARCHAR(256);
    WHILE (i <= n ) DO
    -- 隨機時間 這里生成的都是2018年的
    SELECT   CONCAT(2018,'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 28)),2,0)) INTO datess;
      INSERT INTO t_test(dates ) VALUES (datess);
            SET i=i+1;
    END WHILE;
END //

3、生成測試數據

-- 調用存儲過程 生成500000條
CALL add_vote_memory(500000);

4、創建分區表

CREATE TABLE t_range_test (
    id INT,
    dates DATETIME 
)PARTITION BY RANGE COLUMNS ( dates ) (
    -- 第一組小於2018-01-01的
    PARTITION p1 VALUES LESS THAN  ( '20180101' ),
    PARTITION p2 VALUES LESS THAN  ( '20180201' ),
    PARTITION p3 VALUES LESS THAN  ( '20180301' ),
    PARTITION p4 VALUES LESS THAN  ( '20180401' ),
    PARTITION p5 VALUES LESS THAN  ( '20180501' ),
    PARTITION p6 VALUES LESS THAN  ( '20180601' ),
    PARTITION p7 VALUES LESS THAN  ( '20180701' ),
    PARTITION p8 VALUES LESS THAN  ( '20180801' ),
    PARTITION p9 VALUES LESS THAN  ( '20180901' ),
    PARTITION p10 VALUES LESS THAN ( '20181001' ),
    PARTITION p11 VALUES LESS THAN ( '20181101' ),
    PARTITION p12 VALUES LESS THAN ( '20181201' ),
    -- 最后一組小於2019-01-01大於2018-12-01的
    PARTITION p13 VALUES LESS THAN ( '20190101' )
);

5、把上面測試表的數據插入到分區表中

INSERT INTO t_range_test SELECT * FROM t_test;

6、查看執行計划、結果看PARTITIONS列

EXPLAIN PARTITIONS SELECT * FROM t_range_test WHERE dates >= '20181107124503' AND dates<='20181210111230';

   結果:

7、查看表分區狀況

-- 查詢這個表有多少分區
-- 查詢每一個分區對應的數量
SELECT t.`PARTITION_NAME`,t.`SUBPARTITION_NAME`,t.`TABLE_ROWS` FROM information_schema.`PARTITIONS` t WHERE t.`TABLE_NAME` = 't_range_test';

8、重新定義表分區

-- 給表重新定義分區
ALTER TABLE t_range_test PARTITION BY RANGE COLUMNS ( dates ) (
    -- 第一組小於2018-01-01的
    PARTITION p1 VALUES LESS THAN  ( '20180101' ),
    PARTITION p2 VALUES LESS THAN  ( '20180201' ),
    PARTITION p3 VALUES LESS THAN  ( '20180301' ),
    PARTITION p4 VALUES LESS THAN  ( '20180401' ),
    PARTITION p5 VALUES LESS THAN  ( '20180501' ),
    PARTITION p6 VALUES LESS THAN  ( '20180601' ),
    PARTITION p7 VALUES LESS THAN  ( '20180701' ),
    PARTITION p8 VALUES LESS THAN  ( '20180801' ),
    PARTITION p9 VALUES LESS THAN  ( '20180901' ),
    PARTITION p10 VALUES LESS THAN ( '20181001' ),
    PARTITION p11 VALUES LESS THAN ( '20181101' ),
    PARTITION p12 VALUES LESS THAN ( '20181201' ),
    PARTITION p13 VALUES LESS THAN ( '20190101' ),
    -- 最后一組小於2020-01-01大於2019-01-01的
    PARTITION p14 VALUES LESS THAN ( '20200101' )
);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM