sql >> データベース >  >> RDS >> Mysql

Sphinx vs. MySql-友達のリストを検索(効率/速度)

    わかりました、これは私がこれが機能していると思う方法です。

    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に提供します。これは素晴らしいです。ただし、注意点があります(他の場合と同様):

    • 言語は原始的です
    • 結合は原始的です

    しかし、それはあなたが探している仕事をすることができる/できるので、必ずそれを調べてください。



    1. ROWNUMはページネーションクエリでどのように機能しますか?

    2. インデックスはデータベースのパフォーマンスにどのように影響しますか?

    3. 1つのテーブルから別のテーブルに2つの列をコピーしますが、一意の値のみをコピーします

    4. INDEXとUNIQUEINDEXの両方を指定する必要がありますか?