我正在搜索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。
答案 0 :(得分:1)
放缓的原因...请注意前两个SELECTs
中的每一个如何返回id
。这很便宜,因为id包含在任何二级索引中。
但是当WHERE
有两个部分时,会使用一个索引(FULLTEXT
)来获取ID,然后查找该行以获取值(lat
, lng
的其他部分需要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
运行两个查询。