Mysql 查询优化[减去两个特定行]
我希望在任何两个日期都能有效地测量温度和降水量的差异。目前,查询平均需要1.2分钟 我的桌子结构是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
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)