1

我有一个大表(InnoDB),它基本上有一个带有位置纬度和经度的位置名称。我的查询类似于

SELECT columns FROM table  
WHERE latitude BETWEEN latMin AND latMax
AND longitude BETWEEN longMin AND longMax
AND location LIKE '%mcdonalds%'

唯一的索引是自动递增列的主索引。

我更喜欢使用 InnoDB 所以 FULLTEXT 不是一个选项

我尝试的一个选项是向纬度和经度添加索引,然后做

SELECT id FROM table WHERE 
latitude BETWEEN latMin AND latMax
AND longitude BETWEEN longMin AND longMax

然后我做

$stringOfIds = implode(",",$result);
SELECT columns FROM table WHERE id IN ($stringOfIds)
AND location LIKE '%mcdonalds%'

但它的可扩展性不是很好,因为 $result 可以有数千个条目并且占用太多内存

目前,我采用了全表扫描(上面的第一个查询),但每个查询需要 0.5-1 秒,因此我们将不胜感激。

谢谢

4

1 回答 1

0

标准的 B-TREE 索引不太适合这种查询。我建议更改您的设计以使用 geography 类型,然后创建一个 SPATIAL index。然后,您可以使用此索引MBRContains来快速找到位于边界框内的所有点。

更新:创建空间索引需要 MyISAM,正如评论中指出的那样。

于 2011-09-28T21:44:30.547 回答