使用子查询的MySQL视图优化

时间:2019-02-10 15:51:25

标签: mysql sql query-optimization

我在优化MySQL中的此SQL语句时遇到困难。我有两个独立填充的表,因此每个表的列中记录的时间将不同。我想要的是一个表格(视图),该表格列出了sensor_history中的所有记录以及传感器的Measurement_time上存在的当前过程信息。如果没有过程日志时间,则可以在该特定记录的结果视图的过程字段中使用NULL。

我在这里拥有的作品行之有效,但这是蛮力的,效率低下。 sensor_history表中大约有500k条记录,process_history表中大约有20k条记录。我试图绕过不同的联接方法,但是遇到语法问题或不良结果。我已经尝试了一些在线优化器,但均未成功,因此我希望这里的人可以为我指明正确的方向。

为简单起见,我删除了与其他表的外键关系。没有正在使用的索引,但可以随时提出可能有用的建议。这里是基础知识:

componendDidMount

如何制作更有效的汇总视图?预先感谢。

2 个答案:

答案 0 :(得分:0)

在MySQL中很难真正优化视图。您最大的希望是在以下位置建立索引:

process_history(log_time_utc, process_id, process_speed)

包括了最后两列,因此索引涵盖了查询并且不需要引用数据页。

答案 1 :(得分:0)

当您试图弄清分析师的真正需求时,让我们做一些改进,这些改进现在比以后更容易完成。

DOUBLE占用8个字节,并传送大约16个有效数字。对于我所听说的每个传感器,这都是严重的过大杀伤力。考虑一个4字节的FLOAT,它为您提供了大约7个有效数字。

(我要去哪儿?捕获“传感器”数据不断,最终它会填满磁盘并使其变慢。所以,让我们尽快缩小内容。)

INT是4个字节,范围为+/- 20亿。您是否希望有这么多传感器? 1字节的TINYINT UNSIGNED范围为0..255怎么样?还是`SMALLINT UNSIGNED(1字节,范围0..64K)?同上其他ID。

或者...您真的需要保存所有数据吗?也许可以将每天的原始数据汇总为每小时的最小值,最大值,平均值等?而且只有一天的分辨率才需要一个月的数据?

一旦您的分析师向您解释了的目的,我们将有很多讨论。然后,您需要在行之间阅读以了解他们的想要。 (我也可以在那里帮助您。)