データベースにいくつかのテーブルがあり、関連するクエリに膨大な数の結合が必要であり、テーブルは頻繁に更新されます。mysql検索からsphinx検索への移行に関連して私が聞きたいさまざまな質問のセットがあります。
膨大な数の結合が関係しているため、mysqlエンジンが遅すぎるため、Sphinxを使用してクエリ(全文検索ではない)を実行しようとしています。
だから私の最初の質問は、連結によってフィールドをテキストに変換することによって、非全文検索にスフィンクスを使用することが理にかなっているのかどうかです。
スフィンクスを使用することが提案されている場合、これらすべてのテーブルで複雑なクエリを実行するにはどうすればよいですか。私は多くのことを研究し、これらの3つの選択肢を考え出しました。そして、どちらが最適であるかについてのあなたの見解をお願いします。
- SphinxにはJOINがないため、すべてのテーブルを1つのテーブル(またはビュー)に非正規化してから、その上でsphinxインデクサーを実行します。これは、数十億行になるため、最も非効率的な方法のようです。また、すべてのテーブルの結合を伴わない他のクエリは、深刻な障害になります。
- 各テーブルに個別にスフィンクスインデックスを作成します。ただし、これでは、テーブル間の結合を必要とするクエリにこれらのインデックスを使用することはできません。これを克服するには、結合する列でsql_joined_fieldを使用すると、sphinxが結合プロセスを実行します。
- インデックスを作成するsql_queryにJOINを配置します。テーブルは正規化されたままですが、インデックスを作成するときに非正規化します。これは良い解決策のようです。ただし、親テーブルには多くの更新/削除/挿入があります。それで、それに応じてspinxインデックスを更新することは、トリッキーまたは退屈なビジネスになるのでしょうか。更新が多すぎると、長期的にはパフォーマンスが低下しますか?親テーブルの更新を処理し、スフィンクスインデックスを効率的に変更するにはどうすればよいですか。
この問題に対処するためのより良い方法を知りたいのですが。長い質問で申し訳ありませんが、次の回答で同じことが繰り返されないように、調査を集約したいと思いました。