1

以前に質問されたことがありますが、似たようなものを探してみましたが、何も見つかりませんでした。

私は3つのテーブルを持っています:users、hobbies、user_hobbies(最初の2つをリンクしています)。趣味に基づいて2人のユーザーの類似度を計算したいと思います。このためには、まず、ユーザーAの趣味とユーザーBの趣味の2つのセットが必要です。これらは、2つの簡単なクエリで取得できます。これらの2つのセットは、他の理由でもphpファイルで計算する必要があるため、次のステップで2つの配列で使用できます。

私は彼らの一般的な趣味(つまり、セットの共通部分)を計算する必要があります。

アイデア#1:2つの配列があるので、いくつかの方法で共通の要素を計算できます。

アイデア#2:3番目のクエリ(例SELECT hobby FROM user_hobbies WHERE user_id IN ('uid_A', 'uid_B') GROUP BY hobby HAVING COUNT (*) = 2)を作成できますが、気にする必要はありません。

私の質問はパフォーマンスについてだと思います。手動で計算する方が速いですか、それともmysqlクエリははるかに速いですか?

4

2 に答える 2

0

つまり、操作がセットベースの操作でない場合は、MsSqlまたは任意のRDBMSからシフトアウトすることをお勧めします。

なぜなら、MsSQLを簡単にスケーリングすることはできないからです。

于 2012-12-16T18:05:58.660 に答える
0

すでにuser-hobbiesテーブルを保持するための正規化されたテーブルがあるので、それを使ってみませんか?

一般的に言って、SQLは、少なくとも最初の10万レコード程度でははるかに高速になります。次に、インデックスが作成されていない列を精査するクエリ、または「filesort」を使用してORDERBYキーワードによってもたらされる大きなデータセットを並べ替えるクエリのパフォーマンスが低下します。

スケーラビリティのために、スターターの可能性を絞り込むために内部結合を使用することをお勧めします。

これについて批判的に考えてください。言及されていない他の列は、ユーザーが複数の趣味を持っている可能性があることを示している可能性がありますか?これらは、アプリケーションのスケーリングを検討するときに考慮するものです。

それ以外の場合は、時期尚早に最適化する必要がないように、初心者には問題ありません。

オプション#2を使用します。

于 2012-12-16T18:52:50.910 に答える