gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:40:45 25 4
gpt4 key购买 nike

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

我应该如何呈现代码,以便可以对包含数百万行的表应用分区?我应该如何删除键并更改表以应用分区而不损坏数据?

最佳答案

简短回答:不要。

长答案:PARTITION BY KEY 不会提供任何性能优势(据我所知)。为什么还要使用PARTITION

其他说明:

您应该对几乎所有表使用 InnoDB。

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

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

纬度经度是数字;不要使用 VARCHARFLOAT 是一个可能的候选者(足够精确来区分车辆,但不能区分人)。

你真正的问题是关于速度。让我们看看缓慢的 SELECT 并从它们开始向后工作。添加PARTITIONing很少能解决性能问题。

关于mysql - 更改表以在 mysql 中按键应用分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com