更改表以在mysql中按键应用分区

时间:2015-12-31 06:20:03

标签: mysql partitioning

我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内增加了大约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;

我应该如何呈现代码以便我可以将分区应用于具有数百万行的表?我应该如何删除密钥并更改表以应用分区而不会损坏数据?

1 个答案:

答案 0 :(得分:0)

简短回答:不要。

答案很长:PARTITION BY KEY没有提供任何性能优势(我知道)。为什么还要使用PARTITION

其他说明:

您应该将InnoDB用于几乎所有表格。

InnoDB表 应该有一个明确的PRIMARY KEY

有一个DATETIME数据类型;不要将VARCHAR用于日期或时间,也不要将它们分开。

latitudelongitude是数字;不要使用VARCHARFLOAT可能是候选者(足够精确地区分车辆,但不能区分人员)。

你真正的问题是关于速度。让我们看看慢SELECTs并从他们那里向后工作。添加PARTITIONing很少是性能的解决方案。