mysql — медленные запросы — GAE PHP и облачный SQL

У меня есть приложение для планирования, которое позволяет пользователям создавать массовые события с использованием еженедельного шаблона. Это работает, публикуя уроки шаблона через AJAX к PHP file который берет шаблон и копирует его желаемое количество раз. Количество событий, которые он должен создать за один раз, может быть от 200 до 800 в зависимости.

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

Упрощенный пример:

$events = array('valid array of all events and their details');
foreach($events as $event) {
$query = 'Valid SQL with individual event detaisl';
mysqli_query($connection, $query);
}

На самом деле больше будет происходить, например, вычисление времени начала и окончания, связывание пользователей из junction tablesи т. д. Это должно было бы выполняться 200-800 раз, чтобы создать запись для каждого отдельного события, сделанного шаблоном.

Как бы я ускорить это?

Любое понимание очень ценится!

ОБНОВЛЕНИЕ: я уже пытался увеличить уровень экземпляра SQL. Это не влияет на количество времени, которое требуется.

1

Решение

Некоторые предложения для рассмотрения:

  1. Создание 200-800 новых записей в базе данных за один запрос звучит немного чрезмерно. Логика вашего приложения и модели / структура данных, которые вы используете, вероятно, могут быть значительно улучшены и оптимизированы, если не создавать все события одновременно, а только сохранять настройки, которые позволят вам сгенерировать 800 записей с некоторым кодом, который будет возвращать отдельное событие при необходимости и сохраните его отдельно, если какая-либо пользовательская (не из шаблона) информация была добавлена ​​или изменена в будущем. Это, вероятно, потребует большого количества изменений в вашем коде и может или не может стоить этого (по времени, а не по скорости, что определенно улучшится).

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

  3. Глядя на ваш код, я вижу (я не очень знаком с PHP / mysql), когда вы создаете 800 событий, вы также обращаетесь к базе данных 800 раз (каждый раз, ожидая ответа о завершении). Предполагая, что узкое место было в этих множественных соединениях, затем путем объединения ваших сгенерированных запросов и одновременной подачи их в базу данных, вы потенциально могли бы достичь некоторого улучшения производительности. См. Пример ниже (запишите необходимую точку с запятой в конце каждого сгенерированного запроса и mysqli_multi_query функция, позволяющая отправлять несколько запросов одновременно):

    $events = array('valid array of all events and their details');
    $query = "";
    foreach($events as $event) {
    $query .= 'Valid SQL with individual event detaisl;\n';
    }
    mysqli_multi_query($connection, $query);

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]