2013-04-15 76 views
2

執行MySQL查詢時,在計算任何字段之前是否通過WHERE條件過濾了所有數據?MySQL首先完成 - 過濾WHERE條件或計算字段?

我有一個應用程序,我需要按距離排序,但需要計算查詢(found this which should cover that part of it(頁面8))中來自lat/lng的距離,但它提到查詢速度很慢。我想知道MySQL是否會爲每個數據庫條目計算出距離,然後過濾這些結果,或者如果結果將首先被過濾掉?

編輯:

我並沒有說得很清楚 - 我只需要在這個階段訂購的結果。按距離過濾也會很好,但這總是次要的其他標準 - 即類型將始終需要酒店之前,它是如何接近它的座標

回答

1

WHERE直接在行上,這是也是您無法在WHERE子句中指定列別名的原因。這會導致未知列錯誤。

您可以使用HAVING或子查詢。在這兩種情況下,都會計算所有行的結果,然後進行過濾。

UPDATE:

你必須通過距離來過濾,對不對?所以你不能先過濾行,然後計算距離。但是你可以做的是使用空間擴展。然後你會有空間索引,這可以使你的查詢速度非常快,我猜(從來沒有任何與這樣的事情有關)。

瞭解更多關於它here

更新2:

其實我不明白你的問題是什麼都沒有。你想按照你必須先計算的東西來訂購。那麼問題是什麼?它會很快嗎?我不知道。我只能說,沒有索引可以使用,因爲MySQL不支持計算列上的索引。也許會使用臨時表來分類您獲得的任何數據,這取決於它的數據量。 我建議嘗試一下

只是做

SELECT coordA, coordB 
FROM whereever 
ORDER BY coordA - coordB 

,就是這樣。當你有問題時,再問一次。

要篩選後

SELECT * FROM (
SELECT coordA, coordB, coordA - coordB AS distance 
FROM whereever 
ORDER BY distance 
) sq 
WHERE distance > $foo 

當與索引和/或前面提到的擴展名的身邊過慢放。

+0

好的,謝謝。那麼你會說用一個查詢獲取WHERE條件的數據,然後使用第二個查詢來計算距離並根據第一個查詢對結果進行排序將是實現這種性能的最佳方式(性能明智)? – ollie

+0

@ollie更新了我的答案。 – fancyPants

+0

我不需要像我鏈接的文章那樣按距離過濾 - 我有點不清楚 - 我需要按距離排序,但還有其他標準需要滿足。如果我可以先通過這些其他標準進行篩選,那麼它將節省工作距離,這些條目永遠不會包含在內?理論上,如果我需要,我可以在稍後過濾,但在較小的樣本上。 (在原始問題中增加了幾個句子來澄清) – ollie