私はかなり新しいMySQLです。次のクエリを使って、wordpressユーザー/ usermetaテーブルから値のリストを取得しています。パフォーマンスとは別にクエリが機能するのはひどいので、改善する方法がわかりません。最適化/ MySQLクエリ
クエリには12秒以上かかりますが、400人程度のユーザーであれば、これ以上追加すると大きな問題になります。
MySQLはユニークな列はないと報告していますが、ユーザーIDがすでに結果の一部であるため、これを修正する方法がわかりません。
これはデフォルトのクエリです。完全なクエリでは、郵便番号検索の距離を決定するために緯度/経度を使用して余分な計算が追加されますが、これには余分な時間がかかりません。
私が苦労した主な部分は、値が外部キーとして関連付けられたuser_idとともにmeta_keyおよびmeta_valueとして保存されるという事実です。
私は既に大きな違いをもたらした以下の提案の一部でクエリを更新しました。私はまだ誰かが私がそれらを聞くのが好きなアイデアを持っている場合は、ジョインなどの数を減らすことによってクエリ自体を改善することができると思う。
これは変更を含むクエリであり、距離による検索のための追加部分です。
SELECT DISTINCT
wp_users.ID,
wp_users.user_email,
city_latitude.meta_value as cityLat,
city_longitude.meta_value as cityLong,
service_name.meta_value as service_name,
service_address.meta_value as service_address,
service_category.meta_value as service_category,
service_level.meta_value as service_level,
service_info.meta_value as service_info,
service_area.meta_value as service_area,
service_active.meta_value as service_active,
service_keyword.meta_value as service_keyword,
((ACOS(SIN($userLat * PI()/180) * SIN(city_latitude.meta_value * PI()/180) + COS($userLat * PI()/180) * COS(city_latitude.meta_value * PI()/180) * COS(($userLng - city_longitude.meta_value) * PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance
FROM
wp_usermeta AS usermeta
LEFT JOIN wp_usermeta as city_longitude ON city_longitude.user_id = usermeta.user_id AND city_longitude.meta_key = 'service_long'
LEFT JOIN wp_usermeta as city_latitude ON city_latitude.user_id = usermeta.user_id AND city_latitude.meta_key = 'service_lat'
LEFT JOIN wp_usermeta as service_name ON service_name.user_id = usermeta.user_id AND service_name.meta_key = 'service_name'
LEFT JOIN wp_usermeta as service_category ON service_category.user_id = usermeta.user_id AND service_category.meta_key = 'service_category'
LEFT JOIN wp_usermeta as service_address ON service_address.user_id = usermeta.user_id AND service_address.meta_key = 'service_address'
LEFT JOIN wp_usermeta as service_level ON service_level.user_id = usermeta.user_id AND service_level.meta_key = 'wp_user_level'
LEFT JOIN wp_usermeta as service_info ON service_info.user_id = usermeta.user_id AND service_info.meta_key = 'service_additional'
LEFT JOIN wp_usermeta as service_area ON service_area.user_id = usermeta.user_id AND service_area.meta_key = 'service_area'
LEFT JOIN wp_usermeta as service_active ON service_active.user_id = usermeta.user_id AND service_active.meta_key = 'active'
LEFT JOIN wp_usermeta as service_keyword ON service_keyword.user_id = usermeta.user_id AND service_keyword.meta_key = 'service_keywords'
INNER JOIN wp_users ON wp_users.ID = usermeta.user_id
WHERE (service_name.meta_value != '' AND service_name.meta_value != 'Anonymous') AND service_level.meta_value = 0 AND service_active.meta_value = 1
HAVING distance < $search_distance
ORDER BY distance ASC
での発言を削除する必要がありますか?私達にこれを示してください。フル・テーブル・スキャンが必要な結合がありますか?また、WHERE条件を適切なONパーツに追加する必要があります。 – Seb
@P Heron - いくつかのサンプル日付でテーブルから作成を投稿できますか? wp_usermetaに1回以上参加する必要はありません。 http:// sqlfiddleでデータを送信すると、私はあなたに問い合わせを行います。com/ –
@Bernd Buffen - それは大変ありがとうございます。私は[link](http://sqlfiddle.com/#!9/af672a)でいくつかのデータをセットアップしました。これまでにそれを使用したことはありませんでした。 –