2014-02-21 45 views
0

因此,我想從我們擁有的大約34000條記錄中獲取一些地理數據。MySql搜索效率

我們存儲了Person的記錄,其中包含姓氏,姓氏,地址和郵編等基本信息。

我想獲取有關郵編的信息,並將其與他們的Longitue和Latitude座標聯繫起來。 爲此,我還有一張澳大利亞郵政編碼表,以及他們的長/寬和絃。

SELECT count(p.postcode) AS `count`, p.postcode, pctlt.Lat, pctlt.`Long` 
FROM person AS p 
INNER JOIN pcodetolonglat AS pctlt ON pctlt.Pcode = p.postcode 
WHERE length(p.postcode)=4 
GROUP BY p.postcode 

目前,這個腳本一個也到兩分鐘需要運行,

有沒有更有效的方法來得到相同的結果?

+2

因爲我想統計郵編中'生活'的'人'的數量,我想知道每個郵編的'長/緯'合作伙伴例如:郵編2148中的68條記錄,緯度: -33.78 Long:150.87 – Lars

+0

我現在看到了,我的錯 – zerkms

+0

我想在Person表中得到第一個郵政編碼計數的結果,比如「select count(*)'count,postcode from person group by postcode」,然後將結果加入pcodetolonglat表獲得經緯度。 – anonymous

回答

0

這是您的查詢:

SELECT count(p.postcode) AS `count`, p.postcode, pctlt.Lat, pctlt.`Long` 
FROM person p INNER JOIN 
    pcodetolonglat pctlt 
    ON pctlt.Pcode = p.postcode 
WHERE length(p.postcode) = 4 
GROUP BY p.postcode; 

你不能做與此查詢索引。 person(postcode)上的索引應該有所幫助。這是第一次嘗試。以下是您所查詢的重寫,消除了外聚集,使用子查詢替代它:

SELECT pctlt.Pcode, pctlt.Lat, pctlt.`Long`, 
     (select count(*) from person p where pctlt.Pcode = p.postcode) as `count` 
FROM pcodetolonglat pctlt 
WHERE length(pctlt.Pcode) = 4 and 
     exists (select 1 from person p where pctlt.Pcode = p.postcode); 

exists條款是模仿inner join的效果。

使用person(postcode)上的索引此查詢可能會比原始運行速度更快。我不喜歡用相關的子查詢替換group by,但在MySQL中它有時具有更好的性能。

+0

你的解決方案在這裏速度快得多,如何使用16k不同的郵政編碼,這給了我大約15k無用的結果,因爲我也需要將這個查詢的結果反饋給另一個算法,我只想要結果的計數至少爲1. – Lars

+0

感謝您的更新。 我明白如何使用索引會更有利於這個原因,並且在此線程之後,我相信對35k記錄進行輕微的重組和清理將引用郵政編碼id而不是postcodes自己會更有效處理。 – Lars