[英]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整數)。
單擊下面的鏈接以了解如何提高MySQL性能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.