@maryaTurova

Возможно ли уменьшить время запроса?

На сервер в виде json заливаются картинки в формате base 64.
В таком виде
{"name":"tfENuLsKgcMLGDDgpfB7gBbc2jyVyw","metod":"main_two","link":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXwAAAF8CAYAAADM5wDKAAAgAElEQVR4nOy9dXxTyf64nzZJkzoVaKlSKIXivsgCCyws7g4tWtyluMMii8viVtxZrLgu7la0pe5u0XOe3x+pIGXl3vvdz70\/Oq\/X8yJNTtJDzswzc97}

Этим кодом я получаю 10 первых для последующей обработки:
<?php
		include ("bd.php");
		
		$response = [];
		$count = 1;
		$result = mysqli_query(
			$db,"SELECT `set_json`,`hash` FROM `pictures` WHERE `result`='WAITING' AND DATE(date) ORDER BY `pictures`.`date` ASC LIMIT 10"
			);
			
		while ($row = mysqli_fetch_array($result)) {
			$response[$count]= json_encode(unserialize($row[0]));
			$count +=1;
			mysqli_query ($db,"UPDATE `pictures` SET `result`='PROCESS' WHERE `hash`='$row[1]'");
		}
		echo json_encode($response);
?>

Дело в том что эта операция занимает несколько секунд .
Что делаю не так?
Как правильно оптимизировать?
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
@aleksmir
Системный администратор, программист
Приведите пожалуйста код создания структуры таблицы pictures, тогда будет более предметный разговор. Сколько записей в таблице pictures?
Из общих рекомендаций:
1) `result`='WAITING' - поле должно быть проиндексировано, иначе запись ищется полным перебором всех записей;
2) условие DATE(`date`) точно правильно написано?
3) если ищете по дате, то поле `date` тоже должно быть проиндексировано;
4) лучше вместо отдельных индексов использовать составной индекс INDEX `result_date` (`result`, `date`);
5) проверьте свои запросы SELECT и UPDATE с помощью команды EXPLAIN, по ней можно будет посмотреть - где происходят тормоза;
6) у вас в этом коде PHP происходит до 11 обращений к БД; операция UPDATE наиболее медленная, вполне вероятно, что она и выполняется в течение нескольких секунд 10 раз; но если будет индекс, то проблем не должно быть;
7) если не поможет, то несколько запросов UPDATE можно заменить одним запросом с помощью функций обновления через условие;
8) кстати для поля `hash` также нужен индекс, раз по нему выполняется поиск;
9) ещё бы я рекомендовал ключ сделать числовым, т.е. `hash` заменить на поле `id` типа UNSIGNED INT AUTOINCREMENT и сделать его ключом PRIMARY KEY;
10) поле `result` тоже нужно сделать числовым и записывать в него, например число 0, если 'WAITING' и 1, если 'PROCESS'.

Уверен, что после выполнения рекомендаций все будет "летать".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы