2015-04-20 75 views
13

我新的MySQL,但已經建立了下面的查詢其優化火種類型MySQL查詢

  1. 查找使用經緯度百分點(表POS)的表附近的用戶。
  2. 刪除已被評分的用戶(桌面滑動)。
  3. 將結果連接到用戶表。

例如,找到與ID = 1(簡體經緯度值)用戶近點(95,95)人

SELECT users.id, name, email, gender, birthyear, latlong FROM (
SELECT * FROM (
    # Find nearby users. 
    SELECT * FROM pos 
     WHERE X(latlong) BETWEEN 90.0 AND 100.0 
     AND Y(latlong) BETWEEN 90.0 AND 100.0 
) AS nearby WHERE owner NOT IN (
    # Find users already rated. 
    SELECT target FROM swipes WHERE owner = 1 
) AND id != 1 
) AS unratedNearby JOIN users ON unratedNearby.owner = users.id; 

這一切工作完美,但我很關心這個查詢的複雜性,以及如何將規模。我有一個SPATIAL KEY 'latlong' ('latlong')表pos(我知道這是一個尋找附近用戶的次優方式,但準確性在這裏並不重要)。 任何一個用戶都可以有無限次的滑動。

一旦用戶和滑動表開始變得非常大,此查詢是否會開始崩潰?除了空間鍵之外,我還有其他的索引嗎?

+0

您應該提供有關表結構的更多信息,並至少解釋爲什麼下面的答案不符合要求 – RuslanN

回答

3

對於這個簡單的任務,您的查詢似乎太複雜了。同時您找到附近的用戶的方法似乎是找人task.Consider此查詢與haversine formula作爲距離函數真的不準確(的這個函數的例子可以很容易在網上找到)

SELECT user_id,name,email,gender,birthyear,latlong,distance(latlong) as  
distance 
FROM pos p left join swipes s on p.user_id = s.owner 
WHERE target_id is NULL 
ORDER by distance asc 

此查詢可以是錯誤的,因爲你的天堂」 t提供了您的創建表語句。但是邏輯是對的。您可以將用戶的位置列表添加到滑動表格中,並且無記錄地進行排序,而不是按距離排列您的搜索結果以獲取附近的人員。

0

縮放是「查找最近」的問題。樸素的解決方案是O(N * N);大多數解決方案都是O(N)。但是它涉及數據的重組。這是O(1)。示例代碼位於博客中。

0

您是否考慮過使用GAE Search API來檢索「最接近」的用戶,然後查詢該列表中的用戶是否被刷卡?

+0

除了Search API沒有表格合併功能,我可以刪除用戶已經滑過的人員之外,這看起來很理想。 –

+0

不幸的是我不認爲你能夠以真正縮放的方式進行表格合併。你可能不得不拆分操作。 – jirungaray