わかりました、これは私がこれが機能していると思う方法です。
MongoDBでもまったく同じ問題があります。 MongoDBは検索機能を「提供」しますが、MySQLと同様に、IO、CPU、メモリの問題に悩まされ、インデックスに対処するために通常よりも多くのサーバーを使用せざるを得ない場合を除いて、決して使用しないでください。
Sphinx(または別の検索技術)を使用する場合の全体的なアイデアは、パフォーマンスの高いインデックスサーチャーを使用することでサーバーあたりのコストを削減することです。
ただし、Sphinxはストレージエンジンではありません。テーブル間の正確な関係をクエリするのは簡単ではありません。SphinxQLを使用してこれを少し修正しましたが、フルテキストインデックスの性質上、MySQLのように統合結合を実行しません。
代わりに、MySQL内に関係を保存しますが、Sphinx内に「ユーザー」のインデックスがあります。
私のウェブサイトには個人的に2つのインデックスがあります:
- メイン(ユーザー、動画、チャンネル、再生リストを収容)
- ヘルプ(ヘルプシステム検索)
これらは、1分ごとに1回デルタ更新されます。リアルタイムインデックスはまだ少し実験的であり、挿入/削除率が高いという問題を個人的に見たので、デルタ更新を続けています。したがって、デルタインデックスを使用して、サイトの主要な検索可能なオブジェクトを更新します。これは、(自分のテストからの)リアルタイムインデックスよりもリソース消費量が少なく、パフォーマンスが高いためです。
削除を処理するために注意してください。デルタを介してSphinxコレクションを処理しない場合は、デルタインデックス用のキルリストと特定のフィルターが必要になります。これが私のインデックスの例です:
source main_delta : main
{
sql_query_pre = SET NAMES utf8
sql_query_pre =
sql_query = \
SELECT id, deleted, _id, uid, listing, title, description, category, tags, author_name, duration, rating, views, type, adult, videos, UNIX_TIMESTAMP(date_uploaded) AS date_uploaded \
FROM documents \
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) OR update_time >( SELECT last_index_time FROM sph_counter WHERE counter_id=1 )
sql_query_killlist = SELECT id FROM documents WHERE update_time>=( SELECT last_index_time FROM sph_counter WHERE counter_id=1 ) OR deleted = 1
}
これにより、削除と追加が1分に1回処理されます。これは、実際のWebアプリではほぼリアルタイムです。
これで、インデックスを保存する方法がわかりました。私は関係について話す必要があります。 Sphinx(SphinxQLが含まれている場合でも)はデータ間で統合結合を行わないため、個人的にはSphinxの外部でリレーションシップを実行することをお勧めします。それだけでなく、このリレーションシップテーブルの負荷が高くなるため、これはスフィンクスインデックス。
クエリを実行してすべてのIDを選択し、そのIDのセットを使用して、sphinxAPIの「filter」メソッドを使用してメインインデックスを特定のドキュメントIDにフィルターします。これが完了すると、通常どおりSphinxで検索できます。これは、これに対処するためにこれまでに見つけた中で最もパフォーマンスの高い方法です。
常に覚えておくべき重要なことは、MySQLがストレージ技術であるのに対し、Sphinxは検索技術であるということです。それを覚えておいてください、そうすれば大丈夫です。
編集
@ N.Bが言ったように(私の答えでは見落としていました)、SphinxにはSphinxSEがあります。原始的であり、開発のテスト段階にありますが(リアルタイムインデックスと同じ)、実際のMyISAM/InnoDBタイプのストレージをSphinxに提供します。これは素晴らしいです。ただし、注意点があります(他の場合と同様):
- 言語は原始的です
- 結合は原始的です
しかし、それはあなたが探している仕事をすることができる/できるので、必ずそれを調べてください。