我有以下查询:
SELECT * FROM table_1
WHERE longitude > 5.71873540775
AND longitude < 6.30763059225
AND latitude > 52.1688986788
AND latitude < 52.5286273212
LIMIT 0, 50
此查询运行速度非常慢。我在经度和纬度上尝试了组合索引和单独索引。该表包含许多行(200.000)和10列。上述查询的结果数为20。
如何让这个特定查询运行得更快?
更新1
这是执行计划:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table_1 range longitude,latitude longitude 6 NULL 1401 Using where
答案 0 :(得分:0)
正如ypercube所说,2个范围查询效果不佳。但也许你无论出于何种原因都无法将引擎切换到myISAM。我们可以通过将工作细分为两个分别进行查找的查询来完成此任务。
你应该在纬度字段上需要一个单独的索引,一个在经度上。
SELECT * FROM
(
SELECT * FROM table_1
WHERE longitude > 5.71873540775
AND longitude < 6.30763059225
) a,
(
SELECT * FROM table_1
WHERE latitude > 52.1688986788
AND latitude < 52.5286273212
) b
WHERE a.id = b.id
仍然不会像使用空间索引一样快,但可能比当前方法快一点。