与子查询MySQL的观点优化

问题描述 投票:0回答:2

我有优化在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 sql query-optimization
2个回答
0
投票

视图是真的很难在MySQL优化。你最大的希望是在一个索引:

process_history(log_time_utc, process_id, process_speed)

最后两列都包含这样的指数涵盖了查询,不需要参照数据页。


0
投票

当你试图找出什么分析家真正需要的,让我们做一些改进,比后来现在更容易做。

DOUBLE需要8个字节,并提供约16显著数字。这是每一个我听到的传感器总矫枉过正。考虑4字节FLOAT,它给你约7显著数字。

(我在哪里与此打算?捕获“传感器”数据不断到来,它最终填满磁盘,这使得它很慢。所以,让我们尽快缩小东西。)

INT是4个字节,并且具有范围为+/- 2十亿。你期待很多传感器?如何与一系列的0..255 1字节TINYINT UNSIGNED?或`SMALLINT UNSIGNED(1字节,范围0..64K)?同上,用于其他任何标识。

或者......你真的需要保存所有的数据?也许日龄的数据可以概括下降到每小时最小值,最大值,平均值等?而个月大的数据只需要一天的分辨率?

我们有很多讨论一旦你的分析跟你解释你想要什么。然后,你需要读间的线,看看他们究竟想要什么。 (我能帮助那里。)

© www.soinside.com 2019 - 2024. All rights reserved.