InnoDB列中文本的高效MySQL选择

InnoDB列中文本的高效MySQL选择,mysql,optimization,indexing,full-table-scan,Mysql,Optimization,Indexing,Full Table Scan,我有一个大型表(InnoDB),它本质上有一个带有位置纬度和经度的位置名。我的问题类似于 SELECT columns FROM table WHERE latitude BETWEEN latMin AND latMax AND longitude BETWEEN longMin AND longMax AND location LIKE '%mcdonalds%' 唯一的索引是自动递增列的主索引 我更喜欢使用InnoDB,所以不能选择全文 我尝试的一个选项是向纬度和经度添加索引,然后

我有一个大型表(InnoDB),它本质上有一个带有位置纬度和经度的位置名。我的问题类似于

SELECT columns FROM table  
WHERE latitude BETWEEN latMin AND latMax
AND longitude BETWEEN longMin AND longMax
AND location LIKE '%mcdonalds%'
唯一的索引是自动递增列的主索引

我更喜欢使用InnoDB,所以不能选择全文

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

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树索引不太适合这种查询。我建议更改您的设计以使用地理类型,然后。然后,可以使用此索引快速查找位于边界框内的所有点


更新:如评论中所述,创建空间索引需要MyISAM。

a好的,全文索引不需要唯一值。全文索引不需要唯一记录。这只是一种比像“%blahblah%”这样的
更高效的文本搜索方式。全文索引在任何情况下都不能是唯一的。只有普通索引才能唯一。啊,明白了。但是我更喜欢使用InnoDB,InnoDB不支持全文,对吗?对不起,除了第1列、第2列之外,我看不出你的查询和我的查询有什么区别。此外,InnoDB不能使用空间索引,对吗?@AndrewPark,令人恼火的是不能。如果你想获得适当的GIS支持,你必须切换到postgreSQL。或者使用MyISAM,但它只有边界矩形。@Andrew Park:很抱歉,你没有看到你已经尝试过了。是的,您是对的,您需要使用MyISAM添加空间索引。我忘了。也许您可以将空间数据存储在一个单独的表中,这样您的主表就可以保留为InnoDB。您可以使用ID连接这两个表。