2015-02-10 2 views
1

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

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

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

$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 раз, чтобы создать запись для каждого отдельного события, созданного шаблоном.

Как я могу ускорить это?

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

UPDATE: Я уже пытался увеличить уровень экземпляра SQL. Это не влияет на количество времени, которое требуется.

+0

Вы можете переложить эту работу на очередь задач? Нужно ли пользователю видеть результат этих операций в ответе? –

+0

Я думаю, это может быть разгружено. Идея состоит в том, что они выбирают временной диапазон и нажимают «Экспорт». Затем он отключается и использует шаблон для создания событий в календаре и перенаправляет пользователя в календарь, чтобы они могли видеть их. – Guy

+0

Guy, как указал Стюарт, одним из вариантов было бы делегировать записи в задачи. Когда вы используете AJAX, вы можете обновить статус асинхронно позже.Другое предложение - настроить ваш экземпляр для совместного размещения с вашим приложением в настройках вашего экземпляра Cloud Cloud. Третья задача - оптимизировать SQL-запросы, чтобы количество необходимых блокировок приближалось к минимуму. – Mario

ответ

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);

Смежные вопросы