@semechki
Я не фрилансер, просто пишу код для себя.

Как уменьшить SQL нагрзку?

Добрый день, очень благодарна за вашу помощь, я снова к вам за советом)
Есть cron обработчик, который обновляет время показа видео, при этом видео должно показываться каждый час
$sql_select = "SELECT * FROM vid";
    $query = mysqli_query($link,$sql_select) or die("Ошибка: " . mysqli_error($link));
    // Просматриваем все видео
    while ( $res = mysqli_fetch_assoc($query) ) {
    	$startNext = $res['web_date'];

		$dateNow = new DateTime("now");

		// Добавление 10 минут к предстоящей дате видео
    	    	$time = new DateTime($startNext);
		$time->add(new DateInterval('PT10M'));
		
		while ($time < $dateNow) {
			$newdate = strtotime($res['web_date']);
			if ( $res['web_everyday'] != '' ) {
				// Если видео ежедневное
				$hm = explode(":", $res['web_everyday']);

				$newdate += $hm[0] * 3600 + $hm[1] * 60;
				$date = date('d.m.Y H:i', $newdate);

				$endDate = strtotime($res['web_date']);

				$ms = explode(":", $res['web_duration']);

				$endDate += $ms[0]*60 + $ms[1];
				$newEnd = date('d.m.Y H:i', $endDate);

				$endWeb = new DateTime($newEnd);

				$webid = $res['web_id'];
				$lastdate = $res['web_date'];
				if( $res['time_now'] == 1 ){
					// Если видео не запущено, переносим его на следующее время
					$update_webconf = "UPDATE `vid` SET `time_now` = '1', `last_date`='{$lastdate}', `web_date`='{$date}' WHERE `web_id` = '$webid'";
					$result = mysqli_query($link,$update_webconf) or die("Ошибка: " . mysqli_error($link));
				}elseif( $endWeb < $dateNow){
					// Если время видео подошло к концу, очищаем чат и переносим на следующее время
					$delete_chat = "DELETE FROM vid_chat WHERE chat_id= '$webid'";
					$result = mysqli_query($link, $delete_chat) or die("Ошибка " . mysqli_error($link));

					$update_webconf = "UPDATE `vid` SET `time_now` = '1', `last_date`='{$lastdate}', `web_date`='{$date}' WHERE `web_id` = '$webid'";
					$result = mysqli_query($link,$update_webconf) or die("Ошибка: " . mysqli_error($link));
				}
			}else{
				// Если видео назначен на конкретную дату отправляем его в архив
				$update_webconf = "UPDATE `vid` SET `web_archive` = '1', `last_date`='{$lastdate}' WHERE `web_id` = '$webid'";
				$result = mysqli_query($link,$update_webconf) or die("Ошибка: " . mysqli_error($link));
			}
		}
    }

Мне кажется, что такая нагрузка из-за sql запросов в цикле, если нет то поправьте
Как можно не поломав логику сделать всё без большой нагрузки на сервер?
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Вы закачиваете ВСЮ таблицу и построчно анализируя ее делаете апдейты по одной строчке, тут поплохеет любому серверу. Во первых почти наверняка всю логику можно просто засунуть в запрос, так как там проверки по простому условию на дату. Во вторых, я не изучал код, если это сложно реализовать в sql, то хотя бы не делайте update по одной записи, собирайте id необходимых записей и обновляйте пакетом либо через временную таблицу либо через инлайн данные тупо через where id in (список id)

p.s. не пытайтесь везде работать с датами как дата в виде строки, это всегда неудобно, половина кода у вас парсинг строки с датой... работайте с __int64 date timestamp, зачастую это самый удобный тип данных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы