gpt4 book ai didi

mysql - UNIX_TIMESTAMP 字段分区一整年

转载 作者:行者123 更新时间:2023-11-29 10:13:13 31 4
gpt4 key购买 nike

我对分区主题还很陌生,并且由于数据的大量积累而出现了必要性。

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

计划:
按 [ dep_iddate (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 格式 (INT 11) 的日期(from_date 和 to_date)我希望将其划分为一年中的所有月份。这可能吗?

Mysql - 5.7

最佳答案

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

假设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') )

注意 session 的 time_zone 设置。这些日期文字将被解释为当前 time_zone 中的值...例如如果您希望它们是 UTC 日期时间,time_zone 应为 +00:00。

或者,将 UNIX_TIMESTAMP() 表达式替换为文字整数值...这就是 MySQL 将要对 UNIX_TIMESTAMP() 表达式执行的操作。

显然,您可以随意命名分区。

<小时/>

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

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

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

战略索引和精心计划的查询是“非常大”表性能的关键。对于分区表也是如此。

分区并不是一些新手所希望的解决性能问题的 Elixir 。

就在分区内创建子分区而言,我不建议这样做。

关于mysql - UNIX_TIMESTAMP 字段分区一整年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50595590/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com