2013-04-09 2 views
0

그래서 id라는 필드 types을 호출 (다른 테이블에 연결하는 정수를 저장 type라는 필드를했다 (person를 호출 할 수 있습니다) 나는 두 개의 테이블 하나를 가지고 있습니다 말할 수 있습니다.?크고 작거나 작은 검색어 및 더 많은 검색어?

을 향상보다 성능이 될 것입니다 무엇
  • 큰 하나의 질의 타입의 모든 값들을 저장하고 person 표 위에 루핑 우리가 types 쿼리에서 얻은 배열에서 값을 잡는. person 잡아 값에서 모든 루프

  • types

  • typeperson 쿼리에 결합하려면 JOIN 쿼리를 사용하십시오.

주 : 예에서 I는 (분명히) $db 같은 일부 가짜 변수를 사용했다. 그냥 ... CodeIgniter의 데이터베이스 클래스 또는 뭔가 같은이 생각

예제 코드 BP # 1 :

<?php 
    $types = $this->db->query("SELECT * FROM `types`")->result_array(); 

    $query = $this->db->query("SELECT * FROM `person`"); 

    foreach($query->result_array() as $value) 
    { 
     $type = $types[$value['type']]; 
    } 

예제 코드 BP # 2 : (캐싱 형태의 추가 수정 됨)

<?php 
    $query = $this->db->query("SELECT * FROM person"); 

    $types = []; 

    foreach($query->result_array() as $value) 
    { 
     if(empty($types[$value['type']])) 
     { 
      $types[$value['type']] = $this->db->query("SELECT * FROM types WHERE id = {$value['type']} LIMIT 1")->row_array(); 
     } 
     $type = $types[$value['type']]; 
    } 

예제 코드 BP # 3 : (NB : 나는 ... 전혀 그렇게 쿼리에서 오류를 용서하고, 그것을 수정 주시기 바랍니다 JOIN를 사용하지 않은)

<?php 
    $query = $this->db->query("SELECT * FROM person JOIN types ON person.type = types.id"); 

    foreach($query->result_array() as $value) 
    { 
     // type is already there for us in $value 
    } 

참고 : persontypes 모두 100,000 개가 넘는 행이 예상됩니다.

+1

100k + 행은 큰 문제가 아닙니다. 나를 얻는 것은 정규화 된 테이블처럼 들릴 수있는 "유형"이 "인물"만큼 많은 행을 가질 수 있다는 것입니다. 일반적으로 'INNER JOIN'은 올바른 키 등을 사용하여 찾을 수있는 가장 효율적인 방법입니다. 귀하의 질문은 솔직하게 너무 모호하여 실제 답변을 얻지 못합니다. –

+1

경험상의 원칙 : 데이터베이스가 당신을 위해 그것을 할 수 있다면, 데이터베이스가 당신을 위해 그것을하도록하십시오. – CBroe

답변

1

조인 방법 (옵션 3)이 가장 효율적이어야합니다. 다른 두 가지 방법은 데이터베이스가 처음부터 수행하도록 설계된 처리를 다시 구현하는 것입니다. 모든 관련 데이터는 다음과 같습니다. 완료되기 전에 웹 서버로 보내야합니다!