5

Sphinx に関する本を読んでいるのですが、複数のコアと Sphinx テクノロジ自体を利用するには、必然的に大きなインデックスを小さなインデックスに分割し、マルチインデックス クエリでそれらをクエリする必要があると書かれています。しかし、この本はそれ以上の詳細には触れていません。

このための一般的な戦略は何ですか?UNION のような方法で単純に分割しますか。

index1: SELECT ... FROM table LIMIT 0, 1000
index2: SELECT ... FROM table LIMIT 1000, 1000
...

そして、これらの部品を時々再構築します。検索が行われると、異なるコアがこれらのインデックスを並行して処理しますか? それとも、既存のアイテムをより大きなインデックスに分離し、新しいアイテムをより小さなインデックスに追加するなどの違いですか? または、テキスト フィールドを 1 つのインデックスに分割し、属性を別のインデックスに分割しますか?

4

1 に答える 1

10

素晴らしい質問です。

Sphinx は、単一のローカル インデックス検索ごとに 1 つの CPU コアを使用し、インデックス作成中に 1 つのインデックスを構築するために 1 つの CPU コアを使用します。

2 つのインデックスがある場合、2 つのインデクサーを同時に実行し、2 つの CPU コアを利用できます。インデックス作成は IO 集中型のタスクであるため、あまり多くのインデクサーを実行しないでください。

2 つ (またはそれ以上) のインデックスを取得したら、検索クエリでそれらすべてに言及するか、次のような分散インデックスを使用して、同時にそれらを検索できます。

index index_main
{
        type            = distributed
        local           = index1
        local           = index2
}

ここで、 index1index2は別々のインデックスです。この場合、index_mainに対して検索することができ、sphinx は両方のインデックスから集計された結果を提供します。

データの分割に関しては、範囲別、ハッシュ別、属性値別、および上記のすべてを任意に組み合わせてレコードを分割するなど、必要なすべての手法を利用できます。

私のお気に入りは、次のようにモジュロを使用してインデックス番号を決定することです。

最初のインデックスの場合:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 0

2 番目の場合:

sql_query       = SELECT id, title, description FROM <my_table> WHERE (id % 2) = 1

この方法にはいくつかの欠点がありますが、一般に、大量のデータがない場合は、この方法から始めることをお勧めします。

于 2012-06-04T05:50:38.623 に答える