질문Q #17471
select 를 여러번 하는게 나을까요 php 루프를 돌리는게 나을까요 질문입니다.
amen2017-04-26 11:20:51

 

현재 로직은 

 

200줄의 데이터를 select 한후   

array=array();

 

foreach ( $200줄데이터 as $a ){

   $param=$a-> id 

  (ci 문 생략)  select value from table where id= $param ;

              array[]=value;

}

 

return array;

 

이런식으로 코드가 짜져있습니다. 한마디로 200줄 데이터를 먼저 뽑고 그 데이터에 해당하는 id 하나하나를  

다시 셀렉트 하는것이지요. foreach 안에 select 쿼리가 200번 돕니다. 물론 굉장히 단순한 쿼리고 인덱스가 다 걸려있습니다. 

 

이걸 이대로 쓰는게 좋을지 아니면

 

$result= select  id, value from table where ~~~( 200줄 데이터  조건절 )  ( $result 에는 200줄의 테이블 데이터를 미리 뽑아놓습니다)

foreach( $200줄데이터 as  $a){

   $param= $a->id

   foreach( $result as   $b ){

      if( $b->id == $a->id ){

          $array[]=$b->value;

      } 

   }

  return $array;

}

 

이런식으로 하는게 좋을지 모르겠습니다.  

 

후자의 경우엔 각각 200개씩 데이터 뽑아놓고 루프안에 루프를 돌려서  if문으로 $a->id 와 $b->id 가 같을때 벨류값을 가져와라. 입니다. 

이렇게 되면  $result 오프젝트는 200곱하기 200  총 4000번 돌겠네요. 

대신 $result 를 구하는 select 쿼리는 한번 돌고요. 

 

질문입니다. 

 

1번 . 전자와 같이   $200줄데이터를 한번 뽑고   그안에 select 쿼리를 200번 돌리는게 좋은지 

2번  후자와 같이  $200줄 데이터 한번 뽑고 $result 데이터 한번 뽑아서 루프안에 루프로  총 4000번 루프 돌아서 계산하는게 더 좋은지 

궁금합니다.

 

1번 같은 경우는 db에 부하가 많이 가겠고 

2번 같은 경우는 당연히 웹서버에 부하가 많이 가겠지요. ? ; 

 

현재는 1번과 같이 되어있습니다.  동시처리가 많아진다고 했을때 어떤 방법을 더 권장하시나요 ? 

답변7
#1 amen 2017-04-26 11:32:21

질문을 하고 3번  가장 모범 답안이 생각났네요. 

 

$result 데이터 한번 뽑아서 해당 id, value 를 배열에 키 벨류 로 넣어두고  그 배열을 이용해서 키값으로 찾으면 

 

굳이 200번씩 매번 루프안에 루프질을 안해도 되겠네요..-_-;; 

#2 샤오란 2017-04-26 11:36:20
다행이네요. 타인에게 질문을 하다보면 자신이 먼저 질문하는 과정에서 답을 찾는 경우도 많더라구요~ ㅎㅎ
#3 변종원(웅파) 2017-04-26 13:30:49
한방쿼리로도 가능할걸로 보입니다. ^^
#4 amen 2017-04-26 20:40:42

댓글 감사합니다. 한방 쿼리는  안되었던게 저 두개의 쿼리 결과 오브젝트의 id가 1:1 대응이 아니라서 원하는 계산이 안되더라고요 ㅠ 부득이하게 나눴습니다. 

무튼 질문하는 와중에 해결이 잘 되었고 실제 소스에도 반영하여서 매우 큰 보람을 느끼고 있습니다.

( 운영단에선 달라진게 하나도 없는데 뭘 그렇게 개션했냐고 하네요 ㅋㅋㅋㅋ)

#5 변종원(웅파) 2017-04-27 09:19:48
amen/ 제가 정확한 구조를 몰라서 그럴 수 있겠지만 1:n 구조여도 group_concat 함수로 묶어서 표현할 수도 있습니다. ^^
#6 한대승(불의회상) 2017-04-27 09:21:52
@amen UI가 대폭적으로 바뀌지 않는한 개선 여부를 느끼기 힘들죠.. ^^
#7 kaido 2017-04-27 09:39:46

@amen 백엔드와 프론트엔드의 차이죠 ㅋㅋ

백엔드는 아무리 개선 해도 눈에 안뜁니다.

해봐야 벤치마킹을 수치로 표시하는 정도 밖에 없거나, 에러를 잡아주는 것정도 뿐이 없죠.

 

그런데 html 수정은 별거 아닌 문구 하나 만 바꿔도 엄청 티가 나죠. ㅋㅋㅋ