2012-02-24 70 views
9

我在我的mysql数据库中有数百万条记录。我在Rails 3中为iPhone应用程序实现了一个正常的REST API,但SAYT功能响应非常慢。搜索数据库并返回结果需要很长时间。我怎样才能提高性能?如何在Rails 3应用程序中实现更快搜索(Rails 3应用程序中键入(SAYT)api)

我已经索引了我的表格。 什么方面我应该更像MySQL调优,或者我应该使用rails sphinx还是太阳黑子?有帮助请帮助我所有的专家意见。

+0

你能分享一点信息吗?你搜索了多少列?什么类型的字段?你可以分享你现在使用的查询吗?你一定要看看全文搜索引擎,弹性搜索是另一个好的搜索引擎:http://railscasts.com/episodes?search=search – fatfrog 2012-02-25 03:10:01

+0

速度慢有多慢?你可以发布一个搜索请求的轨道开发日志的要点吗?你的问题的答案很大程度上取决于是否大部分时间用于查询数据库,返回结果,还有其他内容,等等。 – carols10cents 2012-03-02 21:49:23

回答

1

我不确定通过添加更快的搜索来表示您的意思,但将触摸可用性的搜索结果限制为100是很好的做法。没有多少用户会搜索100条记录。

为了实现这样的搜索,我建议你包含关键字表。关键字表应由记录标识和与其关联的关键字以及该关键字在数据库中进行处理的次数组成。

因此,它将帮助您确定前百名记录和最准确的搜索。

同时运行的Map Reduce也有很多搜索算法。我不认为你的移动设备技术可以处理地图缩减。

+2

对于移动设备上的结果的第一页,我会说5-10个结果很多,甚至。 – carols10cents 2012-03-02 21:50:27

1

我也推荐使用像Sphinx这样的全文搜索引擎。

有关于使用狮身人面像和导轨与thinking_sphinx宝石良好的截屏:

Railscast thinking_sphinx gem

随着创业板也可以影响有关通过例如重要的搜索结果添加字段权重:

由于它是一个移动设备,我会以及保持发送给移动到minmum作为MADI媒体链接提到结果的ammount的。

玩得开心

0

取决于你做什么的查询,匹配在列的开头是LIKE查询可以使用索引(从Postgres我肯定知道,他们这样做;在MySQL中我不知道)。

所以,

Widget.where('name LIKE ?', "#{search_term}%").all 

将使用(至少在Postgres的)数据库索引,而

Widget.where('name LIKE ?', "%#{search_term}%").all 

不会。请注意搜索词开头的%。您的行驶里程也可能会随着ILIKE(不区分大小写)和LIKE(区分大小写)而变化。阅读数据库文档。这可能是最低的成果。

由另一个回复提出的搜索引擎是另一种选择。如果您部署在Heroku上,则有一些云端搜索附加组件可以非常容易地进行整合,但它可能比调整您的查询稍微多一点点。

1

为了快速搜索数百万条记录,您可能要使用trie类型的数据结构。如果你想获得一些帮助,http://en.wikipedia.org/wiki/Trie有ruby示例代码。

简化了一下,trie是一种高度存储高效的方法,用于跟踪哪些孩子属于哪些初始字符列表。

本质上,您的SAYT技术会接收一个字符串,并返回字符串的trie的条目前15个左右的结果。

根据行的自相似程度,当然这会影响你的RAM使用。

0

你可以制作一个大多数搜索的表格,然后优先搜索这种方式也许,希望这有助于。

2

我同意一般的答案:使用像Sphinx这样的搜索引擎(并限制返回结果的数量);他们被设计为完全按照你的意愿去做。

然而,尽管数百万条记录听起来很多,但您应该首先确定需要很长时间的事情。我对Sphinx和ThinkingSphinx很有爱 - 他们采取了一个相当复杂的过程,使其变得非常简单和容易。但是,最终,搜索引擎是另一个管理,配置,学习和认识的系统。如果你不必去那里,不容易,不是吗?

这可能是查询,它可能是花时间返回数据(limit是你的朋友!)。或者这可能是因为您每秒获得数百个请求,也许是因为自动完成的延迟太短short - 如果在每个字符上都进行查找,快速打字员或多个用户可以轻松地使用查询超时服务器这对用户不提供任何实用性。

观看Rails日志,看看到底发生了什么。如果这是一个简单的查询性能问题,那么做一个复杂的全文搜索,那么,是的,这将是缓慢的,狮身人面像将是值得的努力。你的数据库有一个explain工具,通过一些工作,可以帮助你理解数据库在做什么来获得结果。索引不被使用的情况并不少见。

什么是缓存? Memcached是一个很棒的工具。或者甚至只是数据库的缓冲区大小设置可以允许它使用更多内存进行缓存。