我有一個非常複雜的查詢正在運行,查找成員加入訂閱詳細信息和按距離排序的位置。複雜的MySQL選擇左連接優化索引
有人可以提供有關正確索引和基數的指示,我應該添加以加快此加載速度。
現在在100萬條記錄上需要75秒,我知道它可以改進。
謝謝。
SELECT SQL_CALC_FOUND_ROWS (((acos(sin((33.987541*pi()/180)) * sin((users_data.lat*pi()/180))+cos((33.987541*pi()/180)) * cos((users_data.lat*pi()/180)) * cos(((-118.472153- users_data.lon)* pi()/180))))*180/pi())*60*1.1515) as distance,subscription_types.location_limit as location_limit,users_data.user_id,users_data.last_name,users_data.filename,users_data.user_id,users_data.phone_number,users_data.city,users_data.state_code,users_data.zip_code,users_data.country_code,users_data.quote,users_data.subscription_id,users_data.company,users_data.position,users_data.profession_id,users_data.experience,users_data.account_type,users_data.verified,users_data.nationwide,IF(listing_type = 'Company', company, last_name) as name
FROM `users_data`
LEFT JOIN `users_reviews` ON users_data.user_id=users_reviews.user_id AND users_reviews.review_status='2'
LEFT JOIN users_locations ON users_locations.user_id=users_data.user_id
LEFT JOIN subscription_types ON users_data.subscription_id=subscription_types.subscription_id
WHERE users_data.active='2'
AND subscription_types.searchable='1'
AND users_data.state_code='CA'
AND users_data.country_code='US'
GROUP BY users_data.user_id
HAVING distance <= '50'
OR location_limit='all'
OR users_data.nationwide='1'
ORDER BY subscription_types.search_priority ASC, distance ASC
LIMIT 0,10
EXPLAIN
ID SELECT_TYPE表型possible_keys鍵key_len REF行額外
1 SIMPLE users_reviews系統USER_ID,review_status NULL NULL NULL 0常量行沒有找到 1 SIMPLE users_locations系統USER_ID NULL NULL NULL 0 const row not found 1 SIMPLE users_data ref subscription_id,active,state_code,country_code state_code 47 const 88241 Using where;使用臨時;使用filesort 1 SIMPLE subscription_types ALL PRIMARY,可搜索的NULL NULL NULL 4使用where;使用加入緩衝區
如果它不經常改變,你可以緩存結果,只要有人更新了某些東西,就運行查詢並緩存新的出來。 –
你爲什麼強制索引爲'(users_data.lat,users_data.lon)'?這些列不在JOIN或WHERE中使用。 – Barmar
嘗試使用INNER JOIN而不是LEFT JOIN。它看起來不像你想要的不匹配的行,因爲你在'WHERE'子句中指定了'subscription_types.searchable'。 – Barmar