MySQL表分区按月分配

sha*_*mor 11 mysql partition

我有一个巨大的表存储许多跟踪事件,例如用户点击.

该表已经达到数百万的数量,并且每天都在增长.当我尝试从大时间帧中获取事件时,查询开始变慢,并且在阅读了相当多的主题后,我明白分区表可能会提高性能.

我想要做的是每月对表进行分区.

我只找到了指导如何每个月手动分区的指南,有没有办法告诉MySQL按月分区,它会自动执行?

如果没有,考虑到我的分区列是手动执行它的命令是一个日期时间?

Wol*_*lph 11

如手册所述:http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

通过对月输出进行哈希分区,可以轻松实现这一点.

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
    ENGINE=INNODB
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 6;
Run Code Online (Sandbox Code Playgroud)

请注意,这仅按月而不是按年分区,在此示例中也只有6个分区(因此6个monhts).

并且用于分区现有表(手册:https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html):

ALTER TABLE ti
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 6;
Run Code Online (Sandbox Code Playgroud)

可以从整个表中查询:

SELECT * from ti;
Run Code Online (Sandbox Code Playgroud)

或者从特定分区:

SELECT * from ti PARTITION (HASH(MONTH(some_date)));
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用`PARTITION BY HASH((年(TIMESTAMP)*100)+ MONTH(TIMESTAMP))`,它提供了格式良好的日期(201511,201512,201601等) - 尽管与concat函数相同 (12认同)
  • 实际上,使用这种特殊的散列方法.或者你可以做`YEAR(tr_date)*12 + MONTH(tr_date)`当然 (3认同)
  • 你的意思是,一旦我分区一整年,下一年就会进入同一个分区? (2认同)
  • 您能否解释一下为什么您只有 6 个分区而不是 12 个 - 这是否意味着每个分区将存储 2 个月的数据? (2认同)