我有一個查詢,我用它來查找按位置排序的結果。結果也必須考慮增值稅,所以這也在查詢中。不幸的是,查詢可能需要4+秒才能運行。任何人都可以發現任何顯而易見的明顯問題,或者提出任何我可以改進的問題嗎?基於緩慢位置的搜索結果查詢
只是爲了澄清什麼在查詢中發生的事情:
- 的距離計算是利用歐氏距離拉/長
- 的incvat字段用於顯示時的價格是含稅
- 在WHEN/THEN語句用來放0價格最底部
查詢:
SELECT * , ROUND(SQRT(POW((69.1 * (company_branch_lat - 52.4862)) , 2) + POW((53 * (company_branch_lng - - 1.8905)) , 2)) , 1) AS distance,
hire_car_day + (hire_car_day * 0.2 * ! hire_car_incvat) AS hire_car_day_incvat,
hire_car_addday + (hire_car_addday * 0.2 * ! hire_car_incvat) AS hire_car_addday_incvat,
hire_car_week + (hire_car_week * 0.2 * ! hire_car_incvat) AS hire_car_week_incvat,
hire_car_weekend + (hire_car_weekend * 0.2 * ! hire_car_incvat) AS hire_car_weekend_incvat
FROM hire_car
LEFT JOIN company_branch ON company_branch_id = hire_car_branchid
LEFT JOIN hire_cartypelink ON hire_cartypelink_carhireid = hire_car_id
LEFT JOIN users ON company_branch_userid = user_id
WHERE 1
GROUP BY hire_car_id
HAVING distance <=30
ORDER BY CASE hire_car_day_incvat
WHEN 0
THEN 40000
ELSE hire_car_day_incvat
END , distance ASC
LIMIT 0 , 30
可能查詢正在進行完整的表掃描,以計算所有行使用距離<= 30的過濾器的距離。如果你有太多的行,這可能需要時間。在選擇前添加EXPLAIN來檢查您的查詢,您將看到瓶頸。 –
不要使用'SQRT()',將初始距離平方並改爲使用('HAVING sqDistance <900')。距離計算在球面上不完全正確(您可以在SO上找到公式,但它更昂貴)。添加盒子邊界檢查以消除大多數行,並使用索引(例如'WHERE company_branch_lat> 52 AND company_branch_lat <53')。優化器可能不喜歡'ORDER BY CASE ...',因爲它可能會混淆簡單的索引掃描;如果你擔心'0'的價格,把'CASE'放在'SELECT'中(或者使用兩列)。 '0.2'有什麼用? –
@ Clockwork-Muse感謝關於放棄SQRT「根」的想法。任何想法如何在保持我需要的功能的同時改進'ORDER BY CASE'? 0.2在英國是20%的稅收 – Chris