MySQL - 索引正在登台服务器上运行,但不在生产上

时间:2014-12-14 14:38:51

标签: mysql sql indexing

我正在使用表中的数据进行一些地理计算,所以我添加了索引。有两个索引,一个在名为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

(对不起,我不知道如何让大查询更容易阅读)

1 个答案:

答案 0 :(得分:0)

你说有两个索引。这表明你需要:

CREATE INDEX index_hotels_on_latitude ON hotels(latitude);
CREATE INDEX index_hotels_on_longitude ON hotels(longitude);

复合索引与两个索引不同。