データベースが大きいとしましょう。検索結果ページの非常に複雑なクエリがあります。以下のクエリでは、user_profile テーブルからいくつかの属性値 ID を取得していることがわかります。たとえば、教育は 1 つの属性です。属性教育の値 ID がある場合、ID が配列キーである配列 (php コード) からこの ID のラベル名を取得します。
public static $education = array(0 => 'No answer',
1 => 'High school',
2 => 'Some college',
3 => 'In college',
4 => 'College graduate',
5 => 'Grad / professional school',
6 => 'Post grad');
他の約 10 の属性についても同様です。そうしないと、クエリがさらに複雑になります。テーブル attribute_id_label を作成し、各属性に対して別の結合を作成して、各属性の値 ID のラベル名を取得する必要があります。これは、追加の 10 個の結合を意味し、クエリが遅くなる可能性があります。しかし、それでもこれは正しい方法です。
私の質問は次のとおりです。テーブルattribute_id_labelに約500レコードしかない場合。テーブルが非常に小さいため、このテーブルとの 10 個の結合で大きな違いが生じるでしょうか? テーブル user_profile が非常に大きく、クエリがすでに非常に複雑な場合でも、ご覧のとおり?
そして、ここに私の質問があります:
SELECT
group_concat(DISTINCT looking.looking_for SEPARATOR ',') as lookingFor,
group_concat(DISTINCT photo.photo ORDER BY photo.photo_id DESC SEPARATOR ',') as photos,
profile.user_id as userId,
url as profileUrl,
nickname,
avatar.photo,
city,
ethnicity,
education,
occupation,
income,
//and 10 more fields like education, occupation, ethnicity...
FROM user_profile profile
LEFT JOIN user_profile_photo photo ON photo.user_id=profile.user_id
LEFT JOIN user_profile_photo avatar ON avatar.photo_id=profile.photo_id
INNER JOIN user_profile_looking_for looking ON looking.user_id=profile.user_id
LEFT JOIN user_profile_txt txt ON txt.user_id = profile.user_id
INNER JOIN place a ON a.place_id=profile.place_id
INNER JOIN (SELECT lat, lon FROM place WHERE place_id = :place_id) b ON (3959 * acos( cos( radians(b.lat) ) * cos( radians( a.lat ) ) * cos( radians( a.lon ) - radians(b.lon) ) + sin( radians(b.lat) ) * sin( radians( a.lat ) ) ) ) < :within
GROUP BY profile.user_id LIMIT 0,12
ほとんどの属性はユーザーによって入力されません。NULL 不可をアドバイスしたので、これらの未入力の属性に使用するのに最適なものは何ですか? 各属性の追加フィールドに使用できます 回答なし。各属性には追加の値があります。答えはありません。たとえば、属性の教育と欲求を与えましょう。属性の教育の ID は 1、欲求は 2 です。
eav_attribute_option
option_id | attr_id | label
1 | 1 | No answer
2 | 1 | High school
3 | 1 | ...
4 | 2 | No answer
5 | 2 | Opportunities
6 | 2 | ...
しかし今、問題は繰り返されています 各属性の答えの値はありません。しかし、これは NULL 値を回避する方法です。これが正しいかどうかはわかりません。