현재 로직은
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번과 같이 되어있습니다. 동시처리가 많아진다고 했을때 어떤 방법을 더 권장하시나요 ?
댓글 감사합니다. 한방 쿼리는 안되었던게 저 두개의 쿼리 결과 오브젝트의 id가 1:1 대응이 아니라서 원하는 계산이 안되더라고요 ㅠ 부득이하게 나눴습니다.
무튼 질문하는 와중에 해결이 잘 되었고 실제 소스에도 반영하여서 매우 큰 보람을 느끼고 있습니다.
( 운영단에선 달라진게 하나도 없는데 뭘 그렇게 개션했냐고 하네요 ㅋㅋㅋㅋ)
@amen 백엔드와 프론트엔드의 차이죠 ㅋㅋ
백엔드는 아무리 개선 해도 눈에 안뜁니다.
해봐야 벤치마킹을 수치로 표시하는 정도 밖에 없거나, 에러를 잡아주는 것정도 뿐이 없죠.
그런데 html 수정은 별거 아닌 문구 하나 만 바꿔도 엄청 티가 나죠. ㅋㅋㅋ
질문을 하고 3번 가장 모범 답안이 생각났네요.
$result 데이터 한번 뽑아서 해당 id, value 를 배열에 키 벨류 로 넣어두고 그 배열을 이용해서 키값으로 찾으면
굳이 200번씩 매번 루프안에 루프질을 안해도 되겠네요..-_-;;