UNIX_TIMESTAMP字段分区整整一年

时间:2018-05-30 02:33:48

标签: mysql sql

我在分区问题上相当新,由于数据的大量积累,必然会出现这种情况。

嗯,基本上它是一个门禁系统,目前有20个部门,每个部门有大约100个用户。系统记录输入和退出的日期和时间(from_date / to_date)我的意图是按部门划分,然后在一年中划分一个月。

计划:
按[ dep_id 日期(from_date和to_date)]对表格进行分区

问题
我有下表。

CREATE TABLE `employee` (
  `employee_id` smallint(5) NOT NULL,
  `dep_id` int(11) NOT NULL,
  `from_date` int(11) NOT NULL,
  `to_date` int(11) NOT NULL,
  KEY `index1` (`employee_id`,`from_date`,`to_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我有UNIX_TIMESTAMP格式的日期(from_date和to_date)(INT 11) 我希望在一年中的所有月份分开它。 它有可能吗?

Mysql - 5.7

1 个答案:

答案 0 :(得分:1)

可以在整数列上使用范围分区。

假设my_int_col是自1970-01-01

以来的unix样式整数秒

我们可以通过以下方式实现每月分区:

PARTITION BY RANGE (my_int_col)
( PARTITION p20180101 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-01-01 00:00') )
, PARTITION p20180201 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-02-01 00:00') )
, PARTITION p20180301 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-03-01 00:00') )
, PARTITION p20180401 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-04-01 00:00') )
, PARTITION p20180501 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-05-01 00:00') )
, PARTITION p20180601 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-06-01 00:00') )

注意会话的time_zone设置。那些日期文字将被解释为当前time_zone中的值...例如如果你想要那些是UTC日期时间,time_zone应该是+00:00。

或者,用一个文字整数值替换UNIX_TIMESTAMP()表达式......这是MySQL将用UNIX_TIMESTAMP()表达式做的事情。

显然,您可以根据需要为分区命名。

注意:对现有表应用分区将需要MySQL创建表的整个副本,在操作完成时对原始表保持独占锁。因此,您将需要足够的存储空间(磁盘)空间,以及完成操作的时间窗口。

可以创建一个已分区的新表,然后一次将旧数据复制一个块。但是要使块大小合理,以避免在大型事务中膨胀ibdata1。然后执行一些RENAME TABLE语句以移出旧表,并将新表移动到。

分区表需要注意的一些注意事项:没有外键支持,并且不能保证分区表比非分区表提供更好的DML性能。

战略指数和精心策划的查询是"非常大"表。对于分区表也是如此。

分区并不是一些新手想要的性能问题的灵丹妙药。

至于在分区内创建子分区,我不推荐它。