我对MySQL并不陌生,但我绝对会在这里头痛不欲。子查询和大表。我如何提高速度?
我想根据日期和大气层显示巴拿马和伯利兹气温差异表。该查询应该根据日期和大气水平与巴拿马和伯利兹数据相匹配,并返回前30个差异,按差异程度排序。
但是,它非常慢(超过30秒),所以它超时。我为这个数据集编写的一些其他查询也很慢(大约26s)。但是如果我只运行子查询,他们只需要1.7秒左右。我应该注意到,下面的这两张表都有440,000多行,但我认为这不是很大。问题可能是我加入表格的方式或我创建子查询的方式。
这里是我的设置:(这是从导出表的SQL,我忽略了一些列。)
/**The table for Panama weather data */
CREATE TABLE `panama_weather_data` (
`Id` varchar(40) NOT NULL,
`OwmPackageId` varchar(30) NOT NULL,
`Level` FLOAT DEFAULT NULL,
`Dt` date DEFAULT NULL,
`Temperature` float DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `panama_weather_data`
ADD PRIMARY KEY (`Id`) USING BTREE;
COMMIT;
/**The table for Belize weather data*/
CREATE TABLE `belize_weather_data` (
`Id` varchar(40) NOT NULL,
`OwmPackageId` varchar(30) NOT NULL,
`Level` FLOAT DEFAULT NULL,
`Dt` date DEFAULT NULL,
`Temperature` float DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `belize_weather_data`
ADD PRIMARY KEY (`Id`) USING BTREE;
COMMIT;
/**Code to populate the tables here*/
这是我的查询:
SELECT ABS(PanamaTemperature-BelizeTemperature) AS TemperatureDif,
PanamaAtmostphericLevel, PanamaTable.Dt
FROM
(SELECT CAST(panama_weather_data.Dt AS DATETIME) AS Dt,
panama_weather_data.Level AS PanamaAtmostphericLevel,
panama_weather_data.Temperature AS PanamaTemperature
FROM panama_weather_data
WHERE panama_weather_data.OwmPackageId = 'openweathermappkg19758' )
AS PanamaTable
JOIN
(SELECT CAST(belize_weather_data.Dt AS DATETIME) AS Dt,
belize_weather_data.Level AS BelizeAtmosphericLevel,
belize_weather_data.Temperature AS BelizeTemperature
FROM belize_weather_data
WHERE belize_weather_data.OwmPackageId = 'openweathermappkg19758')
AS BelizeTable
ON PanamaAtmostphericLevel = BelizeAtmosphericLevel
AND PanamaTable.Dt = BelizeTable.Dt
ORDER BY TemperatureDif
LIMIT 30
我的问题是真的:是无论如何要优化这个查询,并使其不那么痛苦?
对DATETIME进行强制转换是必要的(IMO),因为我最终需要将日期解析为JavaScript日期对象,并且在服务器上预先处理它们会更快。不幸的是,每次都需要评估所有数据,以生成一个图表,显示每个大气层的温度差异。你的建议(重构数据库)正是我想要避免的。我将这些数据作为两个单独的文件接收,并希望将这些信息分开,因为它更简单。显然不是。荣誉。 – SilentStone
然后转换查询的输出 - **不要**加入计算字段上的表 – symcbean