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

改变表以在mysql中按键应用分区,mysql,partitioning,Mysql,Partitioning,我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内添加了430万行,导致数据库速度减慢。我已经应用了索引,但它并没有真正优化速度。对这样的数据应用分区是否有利? 还有,如何在一个有数百万行的表上应用分区?我知道它看起来会像这样 ALTER TABLE gpsloggs PARTITION BY KEY(DeviceCode) PARTITIONS 10; 问题是我在DeviceCode上分区,DeviceCode不是主键,所以分区是不允许的 DROP TA

我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内添加了430万行,导致数据库速度减慢。我已经应用了索引,但它并没有真正优化速度。对这样的数据应用分区是否有利? 还有,如何在一个有数百万行的表上应用分区?我知道它看起来会像这样

ALTER TABLE gpsloggs
    PARTITION BY KEY(DeviceCode)
    PARTITIONS 10;
问题是我在DeviceCode上分区,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;
我应该如何呈现代码,以便能够将分区应用于具有数百万行的表?我应该如何删除键并更改表以应用分区而不损坏数据?

简短回答:不要

详细回答:
按键分区
不提供任何性能优势(据我所知)。为什么还要使用分区呢

其他说明:

几乎所有表都应该使用InnoDB

InnoDB表应该有一个显式的
主键

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

纬度
经度
是数字;不要使用
VARCHAR
<代码>浮动是一个可能的候选项(精确到足以区分车辆,但不能区分人)

你真正的问题是速度。让我们看看慢速
选择
并从中反向工作。添加
分区
很少能解决性能问题