我在mysql数据库中有数百万条记录。我在Rails 3中为iPhone应用程序实现了一个普通的REST api,但SAYT功能响应非常缓慢。搜索数据库并返回结果需要很长时间。如何提高性能?
我已经对表进行了索引。我应该更深入地研究哪些方面,例如MySQL调优,或者我应该使用rails sphinx或sunspot吗?这会有所帮助,请给我您所有专家意见的帮助。
我在mysql数据库中有数百万条记录。我在Rails 3中为iPhone应用程序实现了一个普通的REST api,但SAYT功能响应非常缓慢。搜索数据库并返回结果需要很长时间。如何提高性能?
我已经对表进行了索引。我应该更深入地研究哪些方面,例如MySQL调优,或者我应该使用rails sphinx或sunspot吗?这会有所帮助,请给我您所有专家意见的帮助。
我也建议使用像Sphinx这样的全文搜索引擎。
有一个关于如何使用Sphinx和Rails的很好的视频教程,使用thinking_sphinx gem:
使用该gem,您还可以通过添加字段权重来影响搜索结果的重要性:
由于它是移动设备,我建议将发送到移动设备的结果数量保持在最小限度,正如madi已经提到的那样。
祝玩得开心!
如果你需要快速搜索数百万条记录,你可能需要使用 trie 类型的数据结构。http://en.wikipedia.org/wiki/Trie 中有 Ruby 的示例代码,如果需要帮助可以参考。
简单来说,trie 是一种高效的存储方法,用于跟踪哪些子元素属于哪些初始字符列表。
基本上,你的 SAYT 技术会接收一个字符串,并从 trie 的入口返回前 15 个结果左右。
当然,这取决于你的行有多相似,这将影响你的 RAM 使用情况。
我不确定您所说的更快搜索是什么意思,但将搜索结果限制在100个以增加可用性是很好的。因为没有多少用户会查看100条记录来进行搜索。
为了实现这样的搜索,我建议您包括关键字表。关键字表应该包括记录ID、与之相关联的关键字以及关键字在数据库中被交易的次数。
这样可以帮助您确定前100条记录和最准确的搜索结果。
还有许多算法,例如Map Reduce,可以并行运行。但我认为您的移动设备技术无法处理Map Reduce。
LIKE
查询可能会使用索引(在Postgres中我确定会使用,在MySQL中我不确定)。Widget.where('name LIKE ?', "#{search_term}%").all
将使用数据库索引(至少在Postgres中),而
Widget.where('name LIKE ?', "%#{search_term}%").all
不会的。请注意搜索术语开头的%
。使用ILIKE
(不区分大小写)和LIKE
(区分大小写)条件可能会产生不同的结果。阅读数据库文档。这可能是最简单的解决方法。
另一个回复提出的搜索引擎是另一个选择。如果您部署在Heroku上,有一些云搜索附加组件可以很容易地集成,但这可能仍然比微调查询工作量大一个数量级。