MySQL View 优化与子查询

标签 mysql sql query-optimization

我在 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/

相关文章:

mysql - 在 MySQL 中查找最近的纬度经度点查询不起作用

SQL - 根据查找表中的引用数据更新行

mysql - 如何优化此查询并使其执行得更快?

针对最大值的 MySQL 查询优化

mysql - 是否有任何严肃的 MySQL 命名风格指南?

MySql 工作台 : Log file path must be defined before calling the WriteToLog method error

php - 使用 PHP 数组实现 AND 功能的 SQL 查询

mysql - 如何使用单个 where 子句而不是两个相同的子句?

mysql - 计划命令如何使用DB查询正确获取数据库信息

MySQL,搜索包含十六进制字符的数据