mysql - InnoDB 列中文本的高效 MySQL SELECT

标签 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,所以 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/

相关文章:

haskell - 帮助 GHC 在常量上将 Int 拆箱

ios - 在 iOS 中的 UITableView 中滚动时索引错误

ruby - datamapper 多字段唯一索引

java - 在 Android 中将 Php 连接到 MySQLi

php - 上传带有自定义 ID 的 CSV

php - 在 AJAX 成功时显示成功消息

mySQL 索引和准备状态

MySQL:如何从两个字段进行搜索?

delphi - 在长循环中处理消息时如何最大限度地减少开销

java - 当索引的范围通过 and 限制时,Hotspot 可以消除边界检查吗?