Медленный поиск местоположения

У меня проблема с функцией поиска, она работает правильно, но занимает от 14 до 18 секунд для загрузки, и это вызывает у меня большую боль.

Это функция поиска, которую я использую:

$sql="select *, ( 3959 * acos( cos( radians( $lat ) ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians( $lng ) ) + sin( radians( $lat ) ) * sin( radians( `lat` ) ) ) ) AS distance FROM postcodes, details WHERE `postcode`=postcodes.outcode HAVING " . implode(" AND ", $searches)." AND isactive='y' ORDER BY `distance`"; 

Если у кого-то есть предложения, все они будут приветствоваться


Я потратил больше времени на это и понимаю, что делает запрос, прежде чем добавить дополнительную информацию.

Теперь это мой обновленный запрос, я попытался использовать левое соединение, но я не смог присоединиться к таблице почтового индекса в таблице карточек, и когда я отменил его, столбцы в виде столбцов, где все отображают значение null.

 SELECT "column names", ( 3959 * acos( cos( radians( $lat ) ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians( $lng ) ) + sin( radians( $lat ) ) * sin( radians( `lat` ) ) )) AS distance FROM details inner JOIN car_postcodes ON details.postcode = postcodes.outcode AND distance < 100 AND payment='y' AND expired='n' ORDER BY details.price 

Это значительно сократило время, затрачиваемое на выполнение запроса (примерно до 6 секунд), поэтому мне все же нужно улучшить это.

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

Ответ, который я, по-видимому, прочитал на многих других сообщениях, является подбором,

    Я не уверен, что вы делаете, но следующая строка подозрительна

     FROM postcodes,details 

    Если я не ошибаюсь, это crossjoin (если ваши таблицы большие, это просто умножит размеры и в итоге …, я просто не уверен, что вы пытаетесь сделать здесь)