Mysql 5.6基于时间戳的分区(以微秒为单位)

Mysql 5.6基于时间戳的分区(以微秒为单位),mysql,database-partitioning,Mysql,Database Partitioning,我正在玩mysql 5.6。 我对以下可能性特别感兴趣: DATETIME或TIMESTAMP值可以包含精度高达微秒(6位)的尾部小数秒部分 我想要的是使用这样的时间戳对表进行分区 例如: CREATE TABLE `VALUE_BIS` ( `TSTAMP` timestamp(3) NOT NULL, `ATTRIBUTE_ID` int(11) NOT NULL, `VAL` int(11) unsigned NOT NULL, PRIMARY KEY (`ATTRIBUT

我正在玩mysql 5.6。 我对以下可能性特别感兴趣: DATETIME或TIMESTAMP值可以包含精度高达微秒(6位)的尾部小数秒部分

我想要的是使用这样的时间戳对表进行分区

例如:

CREATE TABLE `VALUE_BIS` (
  `TSTAMP` timestamp(3) NOT NULL,
  `ATTRIBUTE_ID` int(11) NOT NULL,
  `VAL` int(11) unsigned NOT NULL,
  PRIMARY KEY (`ATTRIBUTE_ID`,`TSTAMP`)
)  PARTITION BY RANGE (UNIX_TIMESTAMP(TSTAMP))
     (PARTITION p_s18 VALUES LESS THAN (UNIX_TIMESTAMP('2012-09-18 00:00:00')),
     PARTITION p_s19 VALUES LESS THAN (UNIX_TIMESTAMP('2012-09-19 00:00:00')),
     PARTITION p_Max VALUES LESS THAN (UNIX_TIMESTAMP('2020-09-26 00:00:00' )));
CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( FLOOR(UNIX_TIMESTAMP(report_updated)) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
);
==>错误1491(HY000):分区函数返回错误的类型

*我认为这很正常,因为它返回的unixtimestamp_seconds.micross不是整数*

如果添加毫秒,如

PARTITION p_s18 VALUES LESS THAN (UNIX_TIMESTAMP('2012-09-18 00:00:00.000')
==>错误1697(HY000):分区“p_s18”的值必须具有INT类型

好吧,跟以前一样

如果我更改tstamp列的定义并且不使用毫秒

`TSTAMP` timestamp
==>它工作正常,但我不会存储毫秒,这不是我想要的


有什么想法吗?

MySQL在用时间戳划分表时仍然有一些问题。在过去,他们对学生的行为做了一些改变

我的第一个猜测是,分形秒的存储和使用方式与时间冲突。因此无法正确创建分区(因为类型错误)。。。从而生成您遇到的错误消息

一种解决方法是添加第二个字段,该字段只包含时间戳,不包含分形秒数,并将其用作范围标识符


无论哪种方式,您都应该报告错误。

根据Bjoern的建议,我向mysql跟踪器提交了一个错误(http://bugs.mysql.com/bug.php?id=66958). 这是他们的答案(对他们来说,这不是一个bug)

时间戳(N)不受支持,如文档所述:

“不兼容的更改:在非常旧的MySQL版本(4.1之前)中,时间戳数据类型支持显示宽度,从MySQL 4.1开始就被默默忽略。这在MySQL 5.1中被弃用,在MySQL 5.5中被完全删除。在尝试使用时间戳(N)时,这些行为更改可能导致两种问题场景。”使用MySQL 5.5或更高版本服务器的列:

将MySQL 5.0或更早版本服务器中创建的转储文件(例如,使用mysqldump创建的转储文件)从较新版本系列导入服务器时,包含时间戳(N)的CREATE TABLE或ALTER TABLE语句会导致导入失败,并出现语法错误。“

MySQL 8和10仍然存在此问题

以上关于MySQL不能划分分数的帖子是正确的。 但您不必更改表,您可能不需要使分区变得如此细粒度。 通过设置时间戳是可能的,这是一种快速操作,可与任何时间戳(N)一起使用

例如:

CREATE TABLE `VALUE_BIS` (
  `TSTAMP` timestamp(3) NOT NULL,
  `ATTRIBUTE_ID` int(11) NOT NULL,
  `VAL` int(11) unsigned NOT NULL,
  PRIMARY KEY (`ATTRIBUTE_ID`,`TSTAMP`)
)  PARTITION BY RANGE (UNIX_TIMESTAMP(TSTAMP))
     (PARTITION p_s18 VALUES LESS THAN (UNIX_TIMESTAMP('2012-09-18 00:00:00')),
     PARTITION p_s19 VALUES LESS THAN (UNIX_TIMESTAMP('2012-09-19 00:00:00')),
     PARTITION p_Max VALUES LESS THAN (UNIX_TIMESTAMP('2020-09-26 00:00:00' )));
CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( FLOOR(UNIX_TIMESTAMP(report_updated)) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

我不明白这句话:“……它返回的[sic]不是整数。”这是打字错误还是返回的东西是
?如果是,什么?我的理解是UNIX_时间戳返回了一个整数值。@pilcrow:对不起,我输入了一个错误,并且。没有很好地显示,他们回答了这个错误(请参阅我之前评论中的链接)。我将把它作为解决方案发布。谢谢更新!所以我的假设没有错!