我正在尝试对我的表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。我该怎么办?
提前谢谢!
2条答案
按热度按时间wlsrxk511#
更新:
似乎你不能使用
from_unixtime
在一个PARTITION BY RANGE
查询,因为哈希分区必须基于整数表达式。更多信息请参见此答案它期待着一个
INT
不是一个STRING
(根据错误消息),请尝试:在这里,我将分区值中的年份指定为int ie 2018/2019,而不是“2018”/“2019”中的字符串
unftdfkk2#
自
data_timestamp
实际上是一个BIGINT
,不允许使用日期函数。似乎有两个错误,这可能会修复它们:我假设你
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
在我的讨论中提到了如何从这种混乱中恢复过来。