わかりました、これが私がこれがどのように機能するかです。
MongoDB でもまったく同じ問題があります。MongoDB は検索機能を「提供」しますが、MySQL と同様に、IO、CPU、およびメモリの問題で窒息し、通常よりも多くのサーバーを使用してインデックスに対処する必要がある場合を除き、決して使用しないでください。
Sphinx (または別の検索技術) を使用する場合の全体的なアイデアは、パフォーマンスの高いインデックス サーチャーを使用してサーバーあたりのコストを削減することです。
ただし、Sphinx はストレージ エンジンではありません。テーブル間の正確な関係をクエリするのは簡単ではありません。SphinxQL を使用してこれを少し改善しましたが、全文インデックスの性質上、MySQL で得られるような統合結合はまだ実行されません。
代わりに、MySQL 内にリレーションシップを保存しますが、Sphinx 内に「ユーザー」のインデックスを作成します。
私のウェブサイトには、個人的に 2 つのインデックスがあります。
- メイン (ユーザー、動画、チャンネル、プレイリストを収容)
- help (ヘルプ システム検索)
これらは 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 セットを使用して、Sphinx API の「フィルター」メソッドを使用して、メイン インデックスを特定のドキュメント ID にフィルターします。これが完了すると、通常どおり Sphinx で検索できます。これは、これを処理するためにこれまでに見つけた中で最もパフォーマンスの高い方法です。
常に覚えておくべき重要なことは、MySQL がストレージ技術であるのに対し、Sphinx は検索技術であるということです。それを心に留めておけば、大丈夫です。
編集
@NBが言ったように(私の回答では見落としていました)、SphinxにはSphinxSEがあります。原始的で、まだ開発のテスト段階にありますが (リアルタイム インデックスと同じ)、実際の MyISAM/InnoDB タイプのストレージを Sphinx に提供します。これは素晴らしいです。ただし、注意点があります (他の場合と同様):
しかし、それはあなたが探している仕事をすることができます/できるので、必ず調べてください.