我在分区问题上相当新,由于数据的大量积累,必然会出现这种情况。
计划:
按[ 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
答案 0 :(得分:1)
可以在整数列上使用范围分区。
假设my_int_col
是自1970-01-01
我们可以通过以下方式实现每月分区:
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性能。
战略指数和精心策划的查询是"非常大"表。对于分区表也是如此。
分区并不是一些新手想要的性能问题的灵丹妙药。
至于在分区内创建子分区,我不推荐它。