我目前正在构建一个基于4个不同表构建的聚合mySQL表。最大的表(accel)有7.8mil的行,另外3个行的行数小于5mil。我使用的表格有重复的行,即
creatorId, capabilities, frequency_MHz, rssi, dutyCycleLevel
'X^6%g9#tg!Q:]0uqkwcOc)==', '[WEP]', '2412', '-72', '-3733'
'X^6%g9#tg!Q:]0uqkwcOc)==', '[WEP]', '2437', '-54', '-3733'
所有4个表都包含creatorId和dutyCycleLevel。根据存储在其他列中的其他值,我正在对值进行一些操作,然后将结果复制到新表中。一切都必须由一个主表的creatorId和dutyCycleLevel(即' accel')进行分组,这样我们只得到一个最终的creatorId和一个最终的dutyCycleLevel用于所有重复项(即如果' abc'在10个不同的行中出现10次,' abc'只会在最终表中出现一次)。我遇到的问题是构建表的巨大处理时间。我把我的机器一夜之间离开了,它仍然没有完成(现在它已经运行了24小时)。这是我的疑问:
DROP TABLE `BoxCounting_aggregate`;
CREATE TABLE `SHED5`.`BoxCounting_aggregate` (
`creatorId` VARCHAR(55) DEFAULT NULL COMMENT '',
`timestamp` DATETIME DEFAULT NULL COMMENT '',
`latitude` DOUBLE NULL DEFAULT NULL COMMENT '',
`longitude` DOUBLE NULL DEFAULT NULL COMMENT '',
`norm_accel` FLOAT NULL DEFAULT NULL COMMENT '',
`std_dev_accel` FLOAT NULL DEFAULT NULL COMMENT '',
`batteryStatus` FLOAT NULL DEFAULT NULL COMMENT '',
`wifi_seen` INT(11) NULL DEFAULT NULL COMMENT '',
`dutyCycle` INT(11) NULL DEFAULT NULL COMMENT ''
);
INSERT INTO BoxCounting_aggregate
(
creatorId, timestamp, latitude, longitude, norm_accel, std_dev_accel, batteryStatus, wifi_seen, dutyCycle
)
(
SELECT
location.creatorId,
location.timestamp,
sqrt(pow(AVG(accel.accel_x),2)+pow(AVG(accel.accel_y),2)+pow(AVG(accel.accel_z),2)),
STD(accel.accel_z),
case battery.pluggedInDescription
when 'Not Plugged' then 0
when 'Plugged USB' then 0.5
when 'Plugged AC' then 1
else null
end,
COUNT(wifi.dutyCycleLevel),
location.dutyCycleLevel
FROM SHED5.location, SHED5.accel, SHED5.wifi, SHED5.battery
GROUP BY location.creatorId, location.dutyCycleLevel
);
我按照creatorId和dutyCycle级别进行分组,因为这两列是最重要的记录。我在纬度和经度上使用AVG,因为我想要存储在表中的所有记录的平均位置。就像我说的,creatorId和dutyCycleLevel出现多次。我不认为我的查询在语法上有任何错误,但它绝对是一种低效的方式来做我想做的事情。所有4个表都有索引但没有主键,因为通过将creatorId作为包含重复项的主列,我不能将它用作主键。有什么建议可以改善处理时间吗?或者我必须在什么地方改变查询?