改变表以在mysql中按键应用分区
我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内添加了430万行,导致数据库速度减慢。我已经应用了索引,但它并没有真正优化速度。对这样的数据应用分区是否有利? 还有,如何在一个有数百万行的表上应用分区?我知道它看起来会像这样改变表以在mysql中按键应用分区,mysql,partitioning,Mysql,Partitioning,我有一个包含数百万行的表,未来增长的频率可能会增加,到目前为止,一个月内添加了430万行,导致数据库速度减慢。我已经应用了索引,但它并没有真正优化速度。对这样的数据应用分区是否有利? 还有,如何在一个有数百万行的表上应用分区?我知道它看起来会像这样 ALTER TABLE gpsloggs PARTITION BY KEY(DeviceCode) PARTITIONS 10; 问题是我在DeviceCode上分区,DeviceCode不是主键,所以分区是不允许的 DROP TA
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
<代码>浮动是一个可能的候选项(精确到足以区分车辆,但不能区分人)
你真正的问题是速度。让我们看看慢速选择并从中反向工作。添加分区
很少能解决性能问题