我正在使用表中的数据进行一些地理计算,所以我添加了索引。有两个索引,一个在名为latitude
的列上,另一个在longitude
上。
然后,我需要从生产服务器上的暂存中复制此数据库(300k记录)。所以我从暂存中导出了这个表并将其导入到生产服务器上。
但是当我在那里运行查询时,它很慢,就像索引没有被使用一样。所以我试图删除它们并再次创建它们:
CREATE INDEX index_hotels_on_latitude_and_longitude ON hotels(latitude, longitude)
索引是在0.80s
中创建的。但是,当我再次运行一些查询时,结果再次非常缓慢,就像再次忽略索引一样。
这里有什么问题?我怎么能调试这个问题呢?
数据库是相同的(与登台服务器上的生产数据相同)。
谢谢你们的时间。
修改
以下是查询:
@hotels = Hotel.includes(:services).within(distance, origin: in_city).order("distance ASC")
此查询生成以下SQL:
SELECT (ACOS(least(1,COS(0.5943236044502174)*COS(-2.0637416211957023)*COS(RADIANS(hotels.latitude))*COS(RADIANS(hotels.longitude))+
COS(0.5943236044502174)*SIN(-2.0637416211957023)*COS(RADIANS(hotels.latitude))*SIN(RADIANS(hotels.longitude))+
SIN(0.5943236044502174)*SIN(RADIANS(hotels.latitude))))*3963.1899999999996)
AS distance,hotels.*
FROM `hotels` WHERE ((
(ACOS(least(1,COS(0.5943236044502174)*COS(-2.0637416211957023)*COS(RADIANS(hotels.latitude))*COS(RADIANS(hotels.longitude))+
COS(0.5943236044502174)*SIN(-2.0637416211957023)*COS(RADIANS(hotels.latitude))*SIN(RADIANS(hotels.longitude))+
SIN(0.5943236044502174)*SIN(RADIANS(hotels.latitude))))*3963.1899999999996)
<= 100.0))
ORDER BY distance ASC
(对不起,我不知道如何让大查询更容易阅读)
答案 0 :(得分:0)
你说有两个索引。这表明你需要:
CREATE INDEX index_hotels_on_latitude ON hotels(latitude);
CREATE INDEX index_hotels_on_longitude ON hotels(longitude);
复合索引与两个索引不同。