@Paul14

Почему запрос к mysql внутри цикла while выполняется очень долго?

Время получения 10000 записей о из таблицы clients = 0.08s
Время получения 40000+ записей из таблицы offers = 0.2s

Я хочу пробегаясь по каждому клиенту, вычленить его ID и потом вытащить из таблицы offers все строки с clientID = ID.

В JSON чтобы получить упрощенно такую структуру:
[{
client:{...},
offers:[{...},{...}]
},
{
client:{...},
offers:[{...},{...}]
}]


Вот такой код отрабатывается за 4s. Почему так долго то. Что я делаю не так?
...
	$result = $connection->query($sql);	
	$return = array("contents" => array());	

	if($result->num_rows>0){
		while($row = $result->fetch_assoc()){
		    
		    $return_x = array("client" => array(), 'offers' => array());
		    array_push($return_x['client'],$row);
			
			$sql_calls = "SELECT * FROM offers WHERE clientID = ".$row['id'];
			$result_calls = $connection->query($sql_calls);
			if($result_calls->num_rows>0){
		            while($row_calls = $result_calls->fetch_assoc()){
		                array_push($return_x['offers'],$row_calls);
		            }
			}			
			
			array_push($return['contents'],$return_x);
			
			
		}
	}	
	
	echo json_encode(array(	"result" => 'true',	"array_result" => $return));
	$connection->close();
}
  • Вопрос задан
  • 189 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Время получения 40000+ записей из таблицы offers = 0.2s

Вот такой код отрабатывается за 4s

то есть в цикле делается 40тыс запросов к таблице clients каждый из который выполняется за 0.0001 sec

вам точно надо прочитать про JOIN'ы чтобы одним запросом получить все нужные данные
https://www.w3schools.com/sql/sql_join.asp
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lha_m
PHP developer
Запросы в цикле надо избегать! Иногда бывает, что это трудно сделать, но в вашем случае выглядит легко как уже написал nokimaro используйте JOIN. Примерно так:
SELECT c.id, o.* FROM clients AS c JOIN offers AS o ON c.id = o.clientID WHERE <и тут условия по которым выбираете clients>.

PS. o.* - это плохо, перечисляйте те поля которые вам нужны для работы.
Вот тут хорошая статья про JOIN
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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