簡體   English   中英

MySQL查詢需要很長時間

[英]Mysql query takes long time

您好,我有500k記錄和以下列的表:

id,id_route,id_point,lat,lng,距離,狀態

我想選擇id_routes,它們位於我定義的點的半徑內。

那沒問題

SELECT id_route 
FROM route_path
WHERE (((lat < 48.7210 + 2.0869) AND 
        (lat > 48.7210 - 2.0869)) AND 
       ((lng < 21.2578 + 2.0869) AND 
        (lng > 21.2578 - 2.0869))) 
GROUP BY id_route

但是根據PHPmyadmin,它需要0.2秒。 因為我將要建立龐大的查詢,所以這幾乎就是全部,這才剛剛開始。

我在id_route上也有索引。

主鍵是id,架構是MyISAM

SELECT的說明:

id select_type表的類型possible_keys鍵key_len參考行額外

1 SIMPLE route_path ALL NULL NULL NULL NULL 506506使用where; 使用臨時; 使用文件排序

我想如何減少時間,我認為500K記錄不足以使時間這么長? 謝謝

如果查詢需要更長的時間,並且已正確設置了索引,則需要功能強大的服務器來快速計算查詢!

二維搜索本質上是緩慢的。 這些工具不會告訴您如何改進此特定查詢。

您的表中似乎沒有索引? 您至少應該嘗試INDEX(lat) 這樣會將工作量限制為大約4度的條紋(在您的示例中)。 這可能包括數千行。 然后通過檢查lng消除其中的大多數,但是直到獲取了所有這些數千之后才刪除。

因此,您很想嘗試INDEX(lat, lng)只是發現它忽略了lng 也許它運行速度較慢,因為索引更大。

INDEX(lat, lng, id)並使用子查詢來查找id ,然后對表進行自聯接以完成其余工作,這也許是最簡單的半直截了當的解決方案。 這有點好處,因為這是子查詢的“覆蓋索引”,並且,盡管您掃描了索引中的數千行,但不必獲取數據中的許多行。

可以更快嗎? 是。 但是,復雜性超出了此處可用的空間。 請參閱查找最近的10家比薩店 它涉及InnoDB(用於獲取索引聚類),PARTITION(作為原始2D索引)以及對原始數據的修改(用於將經緯度變為PARITION關鍵字的lat / lng整數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM