3

我有以下查询:

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
4

1 回答 1

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

仍然不会像使用空间索引那样快,但可能比您当前的方法快一点。

于 2012-10-25T17:57:47.163 回答