私は非常に大きなデータベースを使用しています。いくつかのテーブルには 30.000.000 を超えるエントリがあり、現在は mysql を使用していますが、一部の検索クエリでは 1 ~ 2 分以上待つ必要があります。速度を改善する方法はありますか?また、より高速に動作する他のデータベースはありませんか?また、レールには何を使用しますか? 今私は単純な %like% を使用していますが、フィールドを介して検索する他の方法はありますか?
3 に答える
%LIKE%
そのように多くの行で全文検索に使用すると、パフォーマンスが向上しません。Sphinxや優れたThinkingSphinx gemのようなものを使用することを強くお勧めします。すぐに使用できる MySQL および Rails/ActiveRecord で動作し、構成は簡単です。
このガイドでは、Sphinx 検索デーモンを特定のプラットフォームにインストールする方法について説明します。
このthinking-sphinx
ガイドでは、 gemのインストール方法と使用方法について説明します。(Rails 2 と 3 ではインストール ガイドが異なることに注意してください。正しいガイドに従ってください)。
インストール後、検索対象のモデルの列にインデックスを定義できます。
Ryan Bates は、ThinkingSphinx を使用した全文検索に関するRailscasts のエピソードを行いました。
ハッピーコーディング!
mysql を使い続けたい場合は、myisam を使用してください。
インデックスをインテリジェントに作成するための戦略を考えてください。
複雑な結果を戦略的に事前計算します。
必要なデータのみを返します。
データベースの一部を incr perf に非正規化します。
多くのスレーブを使用して読み取ります
データベースを多くのデータベースに分割します
たくさんテストする必要があります。
%like%のとおり
同様の状況に遭遇しました。LIKE ワイルド カードを使用して、大きなテーブルを 3、4 分で検索していました。列にインデックスを付けて MATCH() を使用することで、問題の一部を解決できました。正確さが必要な場合、これはうまくいかないかもしれません。
http://dev.mysql.com/doc/refman//5.5/en/fulltext-search.htmlを参照してください。
注: 検索と一致の両方の組み合わせを使用しています。ここでhttp://anotherfeed.com/feedmap.php?search=facebookを確認できます。最初の 50 件の結果は LIKE を返し、最後の 50 件は MATCH を返し、php を表示します。 mysqlによるインデックススコア。最初の 50 は常により正確です。これは、完全な説明ではなく、タイトルのみをインデックスに登録しているためです。
$query2="SELECT *, MATCH(pagename) AGAINST('".urldecode($_REQUEST['search'])."') AS score FROM anotherfeedv3.af_freefeed WHERE MATCH(pagename) AGAINST('".urldecode($_REQUEST['search'])."') LIMIT $start, $limit";