За последние 24 часа нас посетили 22523 программиста и 1209 роботов. Сейчас ищут 711 программистов ...

BETWEEN очень долго делает вычисления

Тема в разделе "PHP и базы данных", создана пользователем yaroslav_spb, 24 сен 2020.

  1. yaroslav_spb

    yaroslav_spb Новичок

    С нами с:
    29 июл 2020
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток уважаемые программисты. Помогите решить проблему очень долгих вычислений в запросе select between.
    PHP:
    1. // первый цикл
    2. $mysqli->query($query);
    3.               $query = "select * from coffee"; //выводим все из первой таблицы
    4.               $results = $mysqli->query($query);
    5.               while($row = $results->fetch_assoc()){
    6.               $id_coffee = $row['id_coffee']; //запоминаем id первой строки из первой таблицы
    7.               $area = 1/ 222;
    8.  
    9.  
    10.               $mysqli->query($query2);  // второй цикл внутри первого
    11.               $coffee_lat = $row['coffee_lat'];
    12.               $coffee_lon = $row['coffee_lon'];
    13.               //
    14.               $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 с нужными полями второй таблицы
    15.                        
    16.                       $results5 = $mysqli->query($query2);
    17.  
    18.                       while($row5 = $results5->fetch_assoc()){
    19.  
    20.                         echo "".$row5['itogo']. "</br>"; //выводим результат в столбик
    21.  
    22.                         //далее цикл повторяется пока не закончатся строки в первой таблице
    23.                     }
    24.                 }

    таблица 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 у меня нет.

    Все вычисления происходят на быстром хостинге.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не запрос, а запросы. 200, по количеству итераций. Если я правильно понял код.
    2 секунды - довольно быстро, при таком подходе.
     
    artoodetoo нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @yaroslav_spb тебе надо прокачать скиллы в запросах по нескольким таблицам сразу. То есть JOIN. Понадобится 1 запрос вместо 201.

    Ещё один приём - собрать пачку ID (в твоём случае 200 штук) и применить её в условии WHERE id_coffee IN(...). Получится два запроса вместо 201.

    Запросы в цикле это очень плохая практика!