MySQL全文索引和常规索引搜索

时间:2015-04-22 21:18:13

标签: mysql full-text-search innodb database-indexes

我正在搜索3列数据:description(全文),lat(索引)和lon(索引)。

当我SELECT id FROM table MATCH(description) AGAINST ('query' IN BOOLEAN MODE)时,所有事情都会快速处理并且运行正常。

当我SELECT id FROM table WHERE lat BETWEEN a and b AND lon BETWEEN x and y时,所有事情都会快速处理并且运行正常。

当我将两个where子句与一个简单的AND合并并执行SELECT id FROM table MATCH(description) AGAINST ('query' IN BOOLEAN MODE) AND (lat BETWEEN a and b AND lon BETWEEN x and y)时,一切正常,但处理需要几秒钟。

前两个查询需要0.1秒,最后一个查询需要3秒以上,我似乎无法弄清楚如何让它运行得更快。描述是全文索引,lat / lon列是普通索引。

关于什么会减慢速度和/或如何解决问题的任何想法?该表是InnoDB。

2 个答案:

答案 0 :(得分:1)

放缓的原因...请注意前两个SELECTs中的每一个如何返回id。这很便宜,因为id包含在任何二级索引中。

但是当WHERE有两个部分时,会使用一个索引(FULLTEXT)来获取ID,然后查找该行以获取值(latlng的其他部分需要WHERE}。这涉及到另一个BTree的另一个查找。如果所需的一切都在RAM中,那也不算太糟糕。但是如果你需要点击磁盘......

让我们检查一下可能的修复方法......你有多少内存? innodb_buffer_pool_size的价值是多少?该设置通常应为可用RAM的70%(假设您有超过4GB)。将其提高到此值可能会减少执行复杂查询所需的I / O,从而加快它的速度。

如果这不起作用,我a technique可以有效地使用lat / lng搜索。我还没有和FULLTEXT一起尝试过,所以可能会有一些意想不到的怪癖。但是对于lat / lng搜索它确实非常有效(比普通INDEX更好)。

答案 1 :(得分:0)

此处的问题提供了一个解决方案:MySQL index for normal column and full text column

基本上,您需要使用UNION运行两个查询。