| 제목 | select 를 여러번 하는게 나을까요 php 루프를 돌리는게 나을까요 질문입니다. | ||
|---|---|---|---|
| 카테고리 | PHP | ||
| 글쓴이 | amen | 작성시각 | 2017/04/26 10:50: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번과 같이 되어있습니다. 동시처리가 많아진다고 했을때 어떤 방법을 더 권장하시나요 ? | |||
| 다음글 | PHP 음원 병합시 속성 문제로 인한 오류 관련 문의. (2) | ||
| 이전글 | mysql에서 특정단어 검색질문 (7) | ||
| 
                                amen
                                /
                                2017/04/26 11:02:21 /
                                추천
                                0
                             | 
| 
                                샤오란
                                /
                                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 수정은 별거 아닌 문구 하나 만 바꿔도 엄청 티가 나죠. ㅋㅋㅋ 
 | 
질문을 하고 3번 가장 모범 답안이 생각났네요.
$result 데이터 한번 뽑아서 해당 id, value 를 배열에 키 벨류 로 넣어두고 그 배열을 이용해서 키값으로 찾으면
굳이 200번씩 매번 루프안에 루프질을 안해도 되겠네요..-_-;;