InnoDB列中文本的高效MySQL选择
我有一个大型表(InnoDB),它本质上有一个带有位置纬度和经度的位置名。我的问题类似于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,所以不能选择全文 我尝试的一个选项是向纬度和经度添加索引,然后
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连接这两个表。