我在 MySQL 中优化此 SQL 语句时遇到困难。我有两个独立填充的表,因此每个表列中记录的时间不会相同。我想要的是一个表( View ),其中列出了sensor_history中的所有记录以及传感器测量时间处存在的当前过程信息。如果不存在流程日志时间,我可以接受该特定记录的结果 View 中流程字段中的 NULL。
我这里的东西是有效的,但它是蛮力而且效率低得可怜。 Sensor_history 表中约有 500k 条记录,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`;
如何制作更高效的汇总 View ?提前致谢。
最佳答案
MySQL 中的 View 确实很难优化。您最大的希望是获得以下索引:
process_history(log_time_utc, process_id, process_speed)
包含最后两列,因此索引涵盖查询,不需要引用数据页。
关于MySQL View 优化与子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618156/