@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();
}
  • Вопрос задан
  • 191 просмотр
Решения вопроса 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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