我有一个很大的大表 (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 秒,因此我们将不胜感激。
谢谢
最佳答案
标准的 B-TREE 索引不太适合这种查询。我建议更改您的设计以使用地理类型,然后使用 creating a SPATIAL index .然后您可以将此索引与 MBRContains
一起使用快速找到位于边界框内的所有点。
更新:如评论中所指出的,创建空间索引需要 MyISAM。
关于mysql - InnoDB 列中文本的高效 MySQL SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589979/