Сортировать результаты в MySQL или в массиве PHP? - PullRequest
1 голос
/ 18 мая 2011

Я пытаюсь отсортировать результаты MySQL по расстоянию посетителя сайта от мест, перечисленных в строках базы данных.Должен ли я выполнить сортировку в mySQL и получить отсортированные результаты или получить несортированные результаты из базы данных mySQL, а затем отсортировать с помощью PHP?Есть ли разница в производительности?

Это код SQL, который я буду использовать при сортировке с использованием mySQL.

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) 
+ COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) 
AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance` ASC

Ответы [ 5 ]

2 голосов
/ 18 мая 2011

Когда вам приходится иметь дело с геоданными, я могу порекомендовать PostgreSQL с расширением PostGIS. Это намного быстрее при расчете расстояния между широтой и долготой. В PostgreSQL с PostGIS ваш запрос будет выглядеть так (не проверено):

SELECT *
FROM members
WHERE ST_Distance_Sphere(members.position, ST_GeomFromText("POINT
(47.8012079 13.0395594)", 4326) <= 10000
ORDER BY ST_Distance_Sphere(members.position, ST_GeomFromText("POINT
(47.8012079 13.0395594)", 4326)

Функция ST_Distance_Sphere(members.position, ST_GeomFromText("POINT (47.8012079 13.0395594)", 4326) дает вам расстояние между данной точкой (POINT (47.8012079 13.0395594)) и позицией members.position вашего члена. Вы можете использовать эту функцию несколько раз в одном выражении, PostgreSQL кеширует ее для вас (и не рассчитывает расстояние дважды).

И не забудьте добавить в столбец members.position так называемый «пространственный индекс». Посмотрите на http://postgis.refractions.net/ и http://www.postgresql.org/

В Интернете существует множество учебных пособий, если у вас возникли проблемы с использованием postgresql. Или просто спросите здесь;)

С уважением, пингвин

2 голосов
/ 18 мая 2011

Сделайте это обоими способами и сравните результаты. Это в значительной степени зависит от вашей фактической настройки. Если у вас есть сервер базы данных ниже номинала и отличный веб-сервер, то PHP, вероятно, будет быстрее. Если у вас есть супер-сервер базы данных и 486 для веб-сервера, то сортировка базы данных может быть быстрее. Все зависит от ваших настроек.

Редактировать: Кроме того, я предлагаю хранить ваши долготы и широты в радианах, чтобы вам не приходилось выполнять все эти преобразования каждый раз, когда вы хотите выполнить запрос.

1 голос
/ 18 мая 2011

Я использую строку кода, чтобы определить ограничивающую рамку, окружающую потенциальные результаты, тогда вы выполняете свой запрос только для подмножества данных.

Например, максимальный СПГ, максимальный лат, минимальный СПГ, минимальный лат.

В противном случае ваш оператор SQL будет выполняться для КАЖДОЙ записи в вашей таблице.

Наше приложение в настоящее время имеет 28000 местоположений, поэтому ОГРАНИЧИТЕЛЬНАЯ рамка является ОЧЕНЬ необходимой!

class Geo{
function RadiusCheck($lat, $lng, $miles) {
    $EQUATOR_LAT_MILE = 69.172;
    $maxLat = $lat + $miles / $EQUATOR_LAT_MILE;
    $minLat = $lat - ($maxLat - $lat);
    $maxLng = $lng + $miles / (cos($minLat * M_PI / 180) * $EQUATOR_LAT_MILE);
    $minLng = $lng - ($maxLng - $lng);


    $result['minLat']   = $minLat;
    $result['maxLat']   = $maxLat;
    $result['minLng']   = $minLng;
    $result['maxLng']   = $maxLng;

    return $result;
}
}
1 голос
/ 18 мая 2011

в ответе на вопрос Nyxynyx в комментарии "Кстати, если вы посмотрите на мою опубликованную формулу для определения расстояний, в каких единицах измерения дан ответ? Метры? Мой ввод в (x.xxxxxx, x.xxxxxx) как тот, который используется в Google Maps v3 API. Я не уверен, как он называется? "

Входные данные вашего вычисления - широта (широта) и долгота (lng)

http://en.wikipedia.org/wiki/Geographic_coordinate_system

Найдите объяснение вашего вычисления на

http://en.wikipedia.org/wiki/Great-circle_distance

0 голосов
/ 18 мая 2011

Подожди что?Нет!Если вы возвращаете тысячи результатов, вы можете поспорить, что это будет быстрее на должным образом настроенном сервере MySQL.Установите соответствующие индексы, сохраняйте свои значения широты и долготы в радианах, как предлагает CanSpice, и возвращайте только те результаты, которые вам нужны ... отсортированные на сервере MySQL@CanSpice прав в проверке, которая быстрее, но, по моему мнению, если ваш сервер БД работает медленнее, вы неправильно его настроили.Исправь это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...