Доброго времени суток уважаемые программисты. Помогите решить проблему очень долгих вычислений в запросе select between. PHP: // первый цикл $mysqli->query($query); $query = "select * from coffee"; //выводим все из первой таблицы $results = $mysqli->query($query); while($row = $results->fetch_assoc()){ $id_coffee = $row['id_coffee']; //запоминаем id первой строки из первой таблицы $area = 1/ 222; $mysqli->query($query2); // второй цикл внутри первого $coffee_lat = $row['coffee_lat']; $coffee_lon = $row['coffee_lon']; // $query2 = "select *, SUM(quarters_starbucks) as itogo, count(*) as count from starbucks, coffee WHERE id_coffee= $id_coffee and ($coffee_lat BETWEEN lat_starbucks - $area AND lat_starbucks + $area AND $coffee_lon BETWEEN lon_starbucks - $area AND lon_starbucks + $area)"; // берем запомненный id из первой таблицы, далее из строки с этим id берем нужные поля и проверяем на BETWEEN с нужными полями второй таблицы $results5 = $mysqli->query($query2); while($row5 = $results5->fetch_assoc()){ echo "".$row5['itogo']. "</br>"; //выводим результат в столбик //далее цикл повторяется пока не закончатся строки в первой таблице } } таблица coffee имеет 200 записей таблица starbucks 27 000 записей такой запрос выполняется примерно 2 секунды (что очень долго) Когда мне потребовалось поменять таблицу coffee на другую, где количество записей не 200, а больше 30 000, то запрос понятное дело вообще перестал успевать выводить информацию за время ожидания браузера (больше 15 минут где-то ждал ) Подскажите, как ускорить процесс выполнения запроса? Переменные coffee_lat, coffee_lon, lat_starbucks, lon_starbucks - это координаты и имеют вид 59.999999 (6 знаков после точки) Я пробовал хранить их в разных форматах - varchar, float, double, decimal ничего не влияет на скорость. Формата point у меня нет. Все вычисления происходят на быстром хостинге.
Не запрос, а запросы. 200, по количеству итераций. Если я правильно понял код. 2 секунды - довольно быстро, при таком подходе.
@yaroslav_spb тебе надо прокачать скиллы в запросах по нескольким таблицам сразу. То есть JOIN. Понадобится 1 запрос вместо 201. Ещё один приём - собрать пачку ID (в твоём случае 200 штук) и применить её в условии WHERE id_coffee IN(...). Получится два запроса вместо 201. Запросы в цикле это очень плохая практика!