我有优化在MySQL这个SQL语句的困难。我有一个独立,因此填充每个表的列记录将是不一样的时代两个表。我要的是一个单一的表(视图),列出与出席传感器的measurement_time当前进程的信息sensor_history的所有记录。如果一个进程日志的时间是不存在的,我可以在该特定记录所得查看过程领域NULL的生活。
我在这里工作,但它是蛮力和完全不能胜任。大约有50万条记录在sensor_history表和process_history表20K左右的记录。我试图让我的周围不同的头加入的方法,但我遇到的语法问题或坏的结果。我曾尝试没有成功一些在线优化,在这里,所以我希望有人能指出我在正确的方向。
为简单起见,我已删除了其它表的外键关系。目前,使用没有索引,但随时提出任何可能的帮助。这里有最基础的:
CREATE TABLE `sensor_history` (
`measurement_time_utc` int(11) NOT NULL,
`sensor_id` int(11) NOT NULL,
`sensor_measurement_x` double NOT NULL,
`sensor_measurement_y` double NOT NULL,
`sensor_measurement_z` double NOT NULL,
`sensor_quality` int(11) NOT NULL
);
CREATE TABLE `process_history` (
`log_time_utc` int(11) NOT NULL,
`process_id` int(11) NOT NULL,
`process_speed` double NOT NULL,
`process_load` int(11) NOT NULL
);
CREATE VIEW `rollup` AS SELECT
`sensor_history`.`measurement_time_utc`,
`sensor_history`.`sensor_id`,
`sensor_history`.`sensor_measurement_x`,
`sensor_history`.`sensor_measurement_y`,
`sensor_history`.`sensor_measurement_z`,
`sensor_history`.`sensor_quality`,
(SELECT `process_history`.`process_id` FROM `process_history` WHERE `sensor_history`.`measurement_time_utc`>=`process_history`.`log_time_utc` ORDER BY `process_history`.`log_time_utc` DESC LIMIT 1) AS `process_id`,
(SELECT `process_history`.`process_speed` FROM `process_history` WHERE `sensor_history`.`measurement_time_utc`>=`process_history`.`log_time_utc` ORDER BY `process_history`.`log_time_utc` DESC LIMIT 1) AS `process_speed`,
(SELECT `process_history`.`process_load` FROM `process_history` WHERE `sensor_history`.`measurement_time_utc`>=`process_history`.`log_time_utc` ORDER BY `process_history`.`log_time_utc` DESC LIMIT 1) AS `process_load`
FROM `sensor_history`;
我怎样才能让更高效的汇总看法?提前致谢。
视图是真的很难在MySQL优化。你最大的希望是在一个索引:
process_history(log_time_utc, process_id, process_speed)
最后两列都包含这样的指数涵盖了查询,不需要参照数据页。
当你试图找出什么分析家真正需要的,让我们做一些改进,比后来现在更容易做。
DOUBLE
需要8个字节,并提供约16显著数字。这是每一个我听到的传感器总矫枉过正。考虑4字节FLOAT
,它给你约7显著数字。
(我在哪里与此打算?捕获“传感器”数据不断到来,它最终填满磁盘,这使得它很慢。所以,让我们尽快缩小东西。)
INT
是4个字节,并且具有范围为+/- 2十亿。你期待很多传感器?如何与一系列的0..255 1字节TINYINT UNSIGNED
?或`SMALLINT UNSIGNED(1字节,范围0..64K)?同上,用于其他任何标识。
或者......你真的需要保存所有的数据?也许日龄的数据可以概括下降到每小时最小值,最大值,平均值等?而个月大的数据只需要一天的分辨率?
我们有很多讨论一旦你的分析跟你解释你想要什么。然后,你需要读间的线,看看他们究竟想要什么。 (我能帮助那里。)