Mysql 查询优化[减去两个特定行]

Mysql 查询优化[减去两个特定行],mysql,optimization,Mysql,Optimization,我希望在任何两个日期都能有效地测量温度和降水量的差异。目前,查询平均需要1.2分钟 我的桌子结构是 SELECT (a.t_avg - b.t_avg) as t_diff, (a.prcp - b.prcp) as prcp_diff, a.county as county FROM (SELECT * FROM weather WHERE ob_date='2016-01-01') a JOIN (SELECT * FROM weather WHERE

我希望在任何两个日期都能有效地测量温度和降水量的差异。目前,查询平均需要1.2分钟

我的桌子结构是

SELECT (a.t_avg - b.t_avg) as t_diff, 
        (a.prcp - b.prcp) as prcp_diff, 
        a.county as county 
FROM (SELECT * FROM weather WHERE ob_date='2016-01-01') a 
JOIN (SELECT * FROM weather WHERE ob_date='2016-01-02') b 
  ON a.station_name = b.station_name 
GROUP BY a.county
解释输出 除非需要,否则不要使用“派生表”。这里有一种重新表述的方法:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |

+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| station_name | varchar(20) | NO   | MUL | NULL    |                |
| t_max        | float       | NO   |     | NULL    |                |
| t_min        | float       | NO   |     | NULL    |                |
| t_avg        | float       | NO   |     | NULL    |                |
| prcp         | float       | NO   |     | NULL    |                |
| geo_lat      | float(10,4) | NO   | MUL | NULL    |                |
| geo_long     | float(10,4) | NO   |     | NULL    |                |
| ob_date      | date        | NO   | MUL | NULL    |                |
| county       | varchar(5)  | YES  | MUL | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
您还应该有
索引(ob\u日期、电台名称)

国家
纬度
等,因为这并不是给定电台的每一个变化,对吗?然后制作一个单独的表格来描述站点

SELECT ...
    FROM weather AS a
    JOIN weather AS b  USING(station_name)
    WHERE a.ob_date='2016-01-01'
      AND b.ob_date='2016-01-01'
    GROUP BY ...
那么您的主桌就不会那么笨重了(因此速度会更快):

ob\u date,station\u id
是唯一的,对吗

(将当前架构转换为新架构是否需要帮助?是否需要其他
JOIN
以获取国家/地区的帮助?)


(请不要使用
描述
显示创建表的描述性较低)

解释的输出如何?你有什么索引,如果没有,为什么没有?@Harry我为station_name、ob_date、geo_lat和geo_long添加了索引。我已经在post中添加了解释输出。请勾选“我希望以有效的方式计算温度和降水量的差异。”-在插入新记录时,一次性计算这两个值不是更有意义吗?“昨天”,对于大多数约会来说,应该已经发生了。。。即使偶尔更新一个错误报告的值是一个问题,或者您没有按时间顺序从所有输入源获取数据,通过触发器处理可能还是更有效?(插入或更新记录时,检查是否有第二天的匹配记录,然后更新。)@CBroe 2016-01-01和2016-01-02是样本日期。我应该能够比较任意两个日期的数据。不是SQL专家,我想知道为什么那些人不回答。我认为你们应该试着摆脱“临时”和“文件排序”,但我需要自己去做研究。此外,您还可以按国家分组,这是一个varchar,没有索引。请创建一个国家索引,并告诉我您的查询是否加快了速度
CREATE TABLE Stations (
    station_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    station_name ...,
    lat, lng, country
    PRIMARY KEY station_id
  ) ENGINE=InnoDB;
CREATE TABLE Readings (
    station_id MEDIUMINT UNSIGNED NOT NULL,
    ob_date DATE NOT NULL,
    t_min FLOAT NOT NULL,
    t_avg FLOAT NOT NULL,
    prcp  FLOAT NOT NULL,
    PRIMARY KEY(ob_date, station_id),
    INDEX(station_id, ob_date)