Итак, меня попросили создать скрипт поиска по почтовому индексу. Я все еще довольно плохо знаком с более продвинутым php / mysql. Все, что мне нужно, это помочь упростить этот скрипт. База данных почтовых индексов представляет собой всю базу данных почтовых индексов Великобритании длиной 1,3 млн. Строк. Поэтому, когда я использую скрипт для получения всех почтовых индексов в радиусе, это занимает много времени. Есть ли способ упростить это. Возможно даже использовать Java / Ajax?
<?php
$postcode = str_replace( '+', '%20', $postcode );
$postcode = str_replace( '!"£$^&*()?<>', '', $postcode );
include ('config.php');
$sqlstring = "SELECT * FROM postcodelatlng WHERE postcode LIKE '".$postcode." %' ";
$result = mysql_query($sqlstring);
$row = mysql_fetch_assoc($result);
$lng = $row["longitude"] / 180 * M_PI;
$lat = $row["latitude"] / 180 * M_PI;
mysql_free_result($result);
$sqlstring2 = "SELECT DISTINCT
postcodelatlng.postcode,
(
6367.41 * SQRT(
2 * (
1- COS(RADIANS(postcodelatlng.latitude)) * COS(".$lat.") * (
SIN(RADIANS(postcodelatlng.longitude)) * SIN(".$lng.") + COS(RADIANS(postcodelatlng.longitude)) * COS(".$lng.")
) - SIN(RADIANS(postcodelatlng.latitude)) * SIN(".$lat.")
)
)
) AS Distance
FROM
postcodelatlng AS postcodelatlng
HAVING Distance <= '".$radius."'
ORDER BY Distance ";$result1 = mysql_query($sqlstring2) or die('query failed: ' . mysql_error());
while($row = mysql_fetch_array($result1)){
$searchlets = "SELECT * FROM property_details WHERE postcode = '".$row['postcode']."' ";
$getresult = mysql_query($searchlets);
while($row2 = mysql_fetch_array($getresult)) {
echo ' Output here if Just Postcode was used ';
echo '<hr/>';
}}
// This seraches if only city name was used
$searchlets2 = "SELECT * FROM property_details WHERE street = '".$postcode."' ";
$getresult2 = mysql_query($searchlets2);
while($row3 = mysql_fetch_array($getresult2)) {
echo ' Output Here If just city name was searched ';
echo '<hr/>';
}
mysql_close($con);
?>
Вы можете попробовать ограничивающий прямоугольник, чтобы отфильтровать результаты. Тогда вы могли бы использовать формулу harvesine для лучшей точности. Или вы можете попробовать quadkey, a.k.a, заполняющий пробел, как. По сути, это пространственный индекс, который уменьшает размерность. Это алгоритм LSH. Прочитайте мой ответ на этот вопрос:Гео-поиск (расстояние) в PHP / MySQL (производительность)
Других решений пока нет …