我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内增加了大约430万行,导致数据库速度变慢。我已经应用了索引,但它并没有真正优化速度。将分区应用于此类数据是否有利? 另外,如何在具有数百万行的表上应用分区?我知道它看起来像这样
ALTER TABLE gpsloggs
PARTITION BY KEY(DeviceCode)
PARTITIONS 10;
问题是我在DeviceCode上进行分区,这不是主键,因此分区是不允许的。
DROP TABLE IF EXISTS `gpslogss`;
CREATE TABLE `gpslogss` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`DeviceCode` varchar(255) DEFAULT NULL,
`Latitude` varchar(255) DEFAULT NULL,
`Longitude` varchar(255) DEFAULT NULL,
`Speed` double DEFAULT NULL,
`rowStamp` datetime DEFAULT NULL,
`Date` varchar(255) DEFAULT NULL,
`Time` varchar(255) DEFAULT NULL,
`AlarmCode` int(11) DEFAULT NULL,
PRIMARY KEY `Id` (`Id`) USING BTREE,
KEY `DeviceCode` (`DeviceCode`) USING BTREE
);
所以我改变了表格并将表格放在一个新的数据库中,这样就有0条记录,并且工作正常
DROP TABLE IF EXISTS `gpslogss`;
CREATE TABLE `gpslogss` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`DeviceCode` varchar(255) DEFAULT NULL,
`Latitude` varchar(255) DEFAULT NULL,
`Longitude` varchar(255) DEFAULT NULL,
`Speed` double DEFAULT NULL,
`rowStamp` datetime DEFAULT NULL,
`Date` varchar(255) DEFAULT NULL,
`Time` varchar(255) DEFAULT NULL,
`AlarmCode` int(11) DEFAULT NULL,
KEY `Id` (`Id`) USING BTREE,
KEY `DeviceCode` (`DeviceCode`) USING BTREE
);
PARTITION BY KEY(DeviceCode)
PARTITIONS 10;
我应该如何呈现代码以便我可以将分区应用于具有数百万行的表?我应该如何删除密钥并更改表以应用分区而不会损坏数据?
答案 0 :(得分:0)
简短回答:不要。
答案很长:PARTITION BY KEY
没有提供任何性能优势(我知道)。为什么还要使用PARTITION
?
其他说明:
您应该将InnoDB用于几乎所有表格。
InnoDB表 应该有一个明确的PRIMARY KEY
。
有一个DATETIME
数据类型;不要将VARCHAR
用于日期或时间,也不要将它们分开。
latitude
和longitude
是数字;不要使用VARCHAR
。 FLOAT
可能是候选者(足够精确地区分车辆,但不能区分人员)。
你真正的问题是关于速度。让我们看看慢SELECTs
并从他们那里向后工作。添加PARTITIONing
很少是性能的解决方案。