9

私のmysqlデータベースには何百万ものレコードがあります。Rails 3 で iPhone アプリ用の通常の REST API を実装しましたが、SAYT 機能の応答が非常に遅いです。データベースを検索して結果を返すには、多くの時間がかかります。どうすればパフォーマンスを向上させることができますか?

テーブルにインデックスを付けました。MySQL のチューニングのように、どのような点を詳しく調べる必要がありますか?それとも、Rails sphinx や sunspot を使用する必要がありますか? あなたの専門家のアドバイスをすべて助けてください。

4

6 に答える 6

2

私は一般的な答えに同意します:Sphinxのような検索エンジンを使用します(そして返される結果の数を制限します)。彼らはあなたが望むことを正確に行うように設計されています。

ただし、何百万ものレコードは多くのように聞こえるかもしれませんが、最初に何に時間がかかっているかを判断する必要があります。私はSphinxとThinkingSphinxが大好きです。これらはかなり複雑なプロセスを採用しており、非常にシンプルで簡単です。しかし、結局のところ、検索エンジンは、管理、構成、学習、および知るための別のシステムです。そこに行く必要がなければ、行かないほうが簡単ですよね?

それはクエリかもしれません、それはデータを返すのに費やされた時間かもしれません(limitあなたの友達です!)。または、オートコンプリートの遅延が短すぎるために、1秒あたり数百のリクエストを受け取っている可能性があります。すべての文字でルックアップが発生した場合、高速のタイピストまたは複数のユーザーが、次のクエリを使用してサーバーを簡単にオーバーランする可能性があります。ユーザー向けのユーティリティはありません。

Railsのログを見て、実際に何が起こっているかを確認してください。それが単純なクエリパフォーマンスの問題であり、複雑な全文検索を実行する場合、そうです、それは遅くなり、Sphinxは努力する価値があります。データベースには、explainいくつかの作業を行うことで、データベースが結果を得るために何をしているのかを理解するのに役立つツールがあります。インデックスが使用されないことは珍しいことではありません。

キャッシングはどうですか?Memcachedは素晴らしいツールです。または、データベースのバッファサイズ設定だけでも、キャッシュに使用するメモリを増やすことができます。

于 2012-03-14T19:28:15.940 に答える
1

また、Sphinx などの全文検索エンジンを使用することをお勧めします。

thinking_sphinx ジェムで Sphinx とレールを使用することに関する良いスクリーンキャストがあります。

Railscastのthinking_sphinx gem

その宝石を使用すると、たとえばフィールドの重みを追加することで、重要性に関する検索結果に影響を与えることもできます。

Thinking Sphinx のドキュメント

これはモバイル デバイスであるため、モバイルに送信される結果の量を、madi が既に述べたように最小限に抑えることもできます。

楽しむ

于 2012-03-01T17:12:34.030 に答える
1

何百万ものレコードをすばやく検索するには、おそらくトライ型のデータ構造を使用する必要があります。ヘルプが必要な場合は、 http://en.wikipedia.org/wiki/Trieに Ruby のサンプル コードがあります。

少し簡略化すると、トライは、どの子がどの文字の初期リストに属しているかを追跡する、ストレージ効率の高い方法です。

基本的に、SAYT 技術は文字列を取り込み、その文字列のトライのエントリから上位 15 程度の結果を返します。

もちろん、行の自己相似性に応じて、これは RAM の使用量に影響を与えます。

于 2012-03-13T17:50:43.320 に答える
1

より高速な検索を追加するという意味がよくわかりませんが、使いやすさに関係するため、検索結果を 100 に制限することをお勧めします。検索のために 100 件のレコードを使用するユーザーは多くありません。

このような検索を実現するには、キーワード テーブルを含めることをお勧めします。キーワード テーブルは、レコード ID とそれに関連付けられたキーワード、およびキーワードがデータベースで処理された回数で構成されている必要があります。

したがって、上位 100 件のレコードと最も正確な検索を決定するのに役立ちます。

同時に実行される Map Reduce などの検索アルゴリズムも多数あります。お使いのモバイル デバイス テクノロジーがマップの縮小を処理できるとは思いません。

于 2012-02-25T18:24:25.827 に答える
0

最も検索されたテーブルを作成し、その方法で検索に優先順位を付けることができます。これが役立つことを願っています.

于 2012-03-14T13:34:08.593 に答える
0

作成するクエリに応じてLIKE、列の先頭で一致するクエリはインデックスを使用する場合があります (Postgres では確かにそうであることがわかっていますが、MySQL ではよくわかりません)。

そう、

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

(少なくとも Postgres では) データベース インデックスを使用しますが、

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

しない。%検索語の先頭にある に注意してください。走行距離は、(大文字と小文字を区別しない) 条件とILIKE(LIKE大文字と小文字を区別する) 条件によっても異なる場合があります。データベースのドキュメントを読んでください。それが最も簡単な成果かもしれません。

別の回答で提案されているように、検索エンジンも別のオプションです。Heroku にデプロイしている場合は、統合が非常に簡単なクラウド検索アドオンがいくつかありますが、それでも、クエリを少し調整するよりもはるかに多くの作業が必要になるでしょう。

于 2012-03-11T05:15:47.273 に答える