[英]large DB site, need help speeding up query
必須有一種更快的方法來獲得結果。 這在我的小型數據庫中非常有效,但是在我的大型數據庫(2000萬行)中,此過程將永遠耗時。 我嘗試為lat和lon列創建索引,但這確實有所幫助。 除了硬件升級之外,還有什么方法可以加快速度? 目前,它正在使用一組電源線,並將它們與數據庫中的每一行進行比較。 我將結果限制為10。
$sql = sprintf("SELECT lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM $tbl_name HAVING distance < '%s' ORDER BY distance LIMIT $start, $limit",
mysql_real_escape_string($lat),
mysql_real_escape_string($lon),
mysql_real_escape_string($lat),
mysql_real_escape_string($radius));
$result = mysql_query($sql);
while($row = @mysql_fetch_assoc($result)) {
echo oresults....
}
謝謝,Brian
這只是黑暗中的一槍,但也許您通過將數據范圍限制為可能在距離圈內的緯度和經度來減少計算量。
就像是:
$MinLatitude = $User_Latitude - $Distance
$MaxLatitude = $User_Latitude + $Distance
$MinLongitude = $User_Longitude - $Distance
$MaxLongitude = $User_Longitude + $Distance
然后,您可以在SQL語句中添加WHERE子句以減少計算數量:
WHERE $MinLatitude <= lat AND lat <= $MaxLatitude
AND $MinLongitude <= lon AND lon <= $MaxLongitude
我要做的第一件事是將一張桌子塞好
Create table TrigVals (
Radians decimal(18,15) primary Key Not null,
Sin decimal(18,17) not null,
Cos decimal(18,17) not null)
然后在sin和cos列上創建兩個其他唯一索引以進行反向查找(arcSin和arcos函數),
在表格中填充所需的值范圍(緯度,0到pi / 2;經度,0到pi)
然后在查詢中連接到這些表,而不是對從數據庫檢索的每一行執行實際的數學觸發函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.