按列时间戳划分mysql表

monwx1rj  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(286)

我正在尝试对我的表mysql innodb进行分区。现在,location表中有大约200万行历史数据(并且一直在增长)。当我使用mysql 5.7.22社区服务器时,我必须逐年删除旧的数据集。

CREATE TABLE `geo_data` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `ID_DISP` bigint(20) DEFAULT NULL,
  `SYS_TIMESTAMP` datetime DEFAULT NULL,
  `DATA_TIMESTAMP` bigint(20) DEFAULT NULL,
  `X` double DEFAULT NULL,
  `Y` double DEFAULT NULL,
  `SPEED` bigint(20) DEFAULT NULL,
  `HEADING` bigint(20) DEFAULT NULL,
  `ID_DATA_TYPE` bigint(20) DEFAULT NULL,
  `PROCESSED` bigint(20) DEFAULT NULL,
  `ALTITUDE` bigint(20) DEFAULT NULL,
  `ID_UNIT` bigint(20) DEFAULT NULL,
  `ID_DRIVER` bigint(20) DEFAULT NULL,
  UNIQUE KEY `part_id` (`ID`,`DATA_TIMESTAMP`,`ID_DISP`),
  KEY `Index_idDisp_dataTS_type` (`ID_DISP`,`DATA_TIMESTAMP`,`ID_DATA_TYPE`),
  KEY `Index_idDisp_dataTS` (`ID_DISP`,`DATA_TIMESTAMP`),
  KEY `Index_TS` (`DATA_TIMESTAMP`),
  KEY `idx_sysTS_idDisp` (`ID_DISP`,`SYS_TIMESTAMP`),
  KEY `idx_clab_geo_data_ID_UNIT_DATA_TIMESTAMP_ID_DATA_TYPE` (`ID_UNIT`,`DATA_TIMESTAMP`,`ID_DATA_TYPE`),
  KEY `idx_idUnit_dataTS` (`ID_UNIT`,`DATA_TIMESTAMP`),
  KEY `idx_clab_geo_data_ID_DRIVER_DATA_TIMESTAMP_ID_DATA_TYPE` (`ID_DRIVER`,`DATA_TIMESTAMP`,`ID_DATA_TYPE`)
) ENGINE=InnoDB AUTO_INCREMENT=584390 DEFAULT CHARSET=latin1;

我必须用一个 DATA_TIMESTAMP (格式时间戳日期gps)。

ALTER TABLE geo_data
PARTITION BY RANGE (year(from_unixtime(data_timestamp)))
(
   PARTITION p2018 VALUES LESS THAN ('2018'),
   PARTITION p2019 VALUES LESS THAN ('2019'),
   PARTITION pmax VALUES LESS THAN MAXVALUE
);

错误代码:1697。分区“p2018”的值必须具有int类型
我该怎么办?
我想在后面添加一个子部分范围的id\u disp。我该怎么办?
提前谢谢!

wlsrxk51

wlsrxk511#

更新:
似乎你不能使用 from_unixtime 在一个 PARTITION BY RANGE 查询,因为哈希分区必须基于整数表达式。更多信息请参见此答案
它期待着一个 INT 不是一个 STRING (根据错误消息),请尝试:

ALTER TABLE geo_data
PARTITION BY RANGE (year(from_unixtime(data_timestamp)))
(
   PARTITION p2018 VALUES LESS THAN (2018),
   PARTITION p2019 VALUES LESS THAN (2019),
   PARTITION pmax VALUES LESS THAN MAXVALUE
);

在这里,我将分区值中的年份指定为int ie 2018/2019,而不是“2018”/“2019”中的字符串

unftdfkk

unftdfkk2#

data_timestamp 实际上是一个 BIGINT ,不允许使用日期函数。似乎有两个错误,这可能会修复它们:

ALTER TABLE geo_data
PARTITION BY RANGE (data_timestamp)
(
   PARTITION p2018 VALUES LESS THAN (UNIX_TIMESTAMP('2018-01-01') * 1000),
   PARTITION p2019 VALUES LESS THAN (UNIX_TIMESTAMP('2019-01-01') * 1000),
   PARTITION pmax VALUES LESS THAN MAXVALUE
);

我假设你 data_timestamp 真的是拉 java 岛吗?如果没有,则由用户决定如何处理 * 1000 . SUBPARTITIONs 是无用的;别烦他们。如果您真的想按月份或季度进行分区,那么只需在 PARTITION 水平。
建议:分区不要超过50个左右。
你有多少“司机”?我怀疑你没有万亿。所以,不要盲目使用 BIGINT 用于ID。每个需要8个字节。 SMALLINT UNSIGNED 例如,将只占用2个字节并允许64k驱动程序(等等)。
如果 X 以及 Y 是纬度和经度,这样命名可能更清楚。下面是使用什么数据类型来代替8字节 DOUBLE ,取决于您拥有(和需要)的分辨率。4字节 FLOATs 对车辆来说可能足够好了。
该表有多个冗余索引;扔掉它们。另外,请注意 INDEX(a,b,c) ,也是多余的 INDEX(a,b) .
另请参阅我关于分区的讨论,特别是与时间序列相关的,如您的。
六羟甲基三聚氰胺六甲醚。。。我想知道 SPEED 当它们以光速移动时,你能记录下来吗?
另一点:不要创造 p2019 直到2019年初。你有 pmax 以防你搞砸了,没能及时添加那个分区。以及 REORGANIZE PARTITION 在我的讨论中提到了如何从这种混乱中恢复过来。

相关问题