개발 Q&A

제목 select 를 여러번 하는게 나을까요 php 루프를 돌리는게 나을까요 질문입니다.
카테고리 PHP
글쓴이 amen 작성시각 2017/04/26 10:50:51
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 12553   RSS

 

현재 로직은 

 

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번과 같이 되어있습니다.  동시처리가 많아진다고 했을때 어떤 방법을 더 권장하시나요 ? 

 다음글 PHP 음원 병합시 속성 문제로 인한 오류 관련 문의. (2)
 이전글 mysql에서 특정단어 검색질문 (7)

댓글

amen / 2017/04/26 11:02:21 / 추천 0

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

 

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

 

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

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

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

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

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

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

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

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

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

 

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