2014-11-21 127 views
1

我正在探索按年份和月份劃分MySQL表格的方法。你能否在下面分析我的表格創建,看看這種分區方法是否最終將數據按月份和年份放在這些子分區中?我正在使用MySQL 5.5,我不能使用按年份和月份劃分MySQL表格的高效方法

SELECT * FROM points_log PARTITION (p0_p0sp0); 

驗證分區是否正常工作。如果有一種方法可以在MySQL 5.5中進行驗證,請評論。感謝您對此表分區的反饋和批評。

這裏是我創建表:

CREATE TABLE `points_log` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `nick` char(25) NOT NULL, 
    `amount` decimal(7,4) NOT NULL, 
    `stream_online` tinyint(1) NOT NULL, 
    `modification_type` tinyint(3) unsigned NOT NULL, 
    `dt` datetime NOT NULL, 
    PRIMARY KEY (`id`,`dt`,`nick`), 
    KEY `nick_idx` (`nick`), 
    KEY `amount_idx` (`amount`), 
    KEY `modification_type_idx` (`modification_type`), 
    KEY `dt_idx` (`dt`), 
    KEY `stream_online_idx` (`stream_online`) 
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 
    PARTITION BY RANGE(YEAR(dt)) 
    SUBPARTITION BY HASH(MONTH(dt)) 
    SUBPARTITIONS 12 (
     PARTITION p0 VALUES LESS THAN (2014), 
     PARTITION p1 VALUES LESS THAN (2015), 
     PARTITION p2 VALUES LESS THAN (2016), 
     PARTITION p3 VALUES LESS THAN (2017), 
     PARTITION p4 VALUES LESS THAN (2018), 
     PARTITION p5 VALUES LESS THAN (2019), 
     PARTITION p6 VALUES LESS THAN (2020), 
     PARTITION p7 VALUES LESS THAN MAXVALUE 
    ); 

回答

6
  • SUBPARTITIONs可能是無用的。
  • 不要拆分日期;保持它作爲一個單一的領域。
  • 使用BY RANGE(TO_DAYS(dt)) VALUES LESS THAN (TO_DAYS('2015-02-01'))
  • BY HASH對性能可能完全沒用。
  • WHERE dt BETWEEN .. AND ..不能在你擁有的結構中進行分區修剪。
  • 請勿使用超過50個分區(出於性能原因)。
  • 不要創建多個'future'分區;根據需要構建它們。 (這是一個小小的性能提升。)
  • 請勿將CHAR用於可變長度字段。使用VARCHAR
+0

我真的不知道你爲什麼沒有收到upvote。這是所有真正的恕我直言。 – seven 2017-03-22 16:23:31

+0

謝謝@seven;我一直在用這種方式咆哮很久,也許別人只是在重複着我的眼睛。你確實有一點 - 該問題已被「查看」1171次。 – 2017-03-22 18:30:53