phpmysqlcodeigniterquery-optimization

Making iterated trips to the database is significantly increasing execution time


In Codeigniter, I have the following model

function get_item_history($id)
{  
  //from metadata_history get item_id and corresponding metadata
  $this->db->from('metadata_history')->where(array('id'=>$id, 'current_revision'=> "TRUE"));
  $query = $this->db->get();
  $result = $query->result_array(); //store this in an array

  // loop through the array
  foreach( $result as $key => $row ) 
  {
   $array = array('item_id'=>$row['item_id'], 'current_revision'=> "TRUE");
   $this->db->from('history')->where($array);
   $query = $this->db->get();
   $row['items'] = $query->result_array(); //
   $result[$key] = $row; 
  }

  return $result;
}

The problem is that this results in multiple queries to the SQL table increasing the execution time significantly (pagination is not an option)

I want to be able to pass the first query results to the second query as an array, so that I would have only a single go at the database, then rebuild an array from the results.

How should I rewrite this code (the second part)? Will it be faster (I suppose so)?

EDIT

Rebuilding the array from the results is what is flummoxing me.

http://www.phpbuilder.com/board/showthread.php?t=10373847

this is what I probably want, but am failing the jump


Solution

  • You can use inner query here. It is ideal situation for that -

    function get_item_history($id)
    {  
    
    // Here the above requirement can be achieved in a single query.
    
    $sql = "select * from history h 
    where h.item_id IN (select item_id from metadata_history mh where mh.id = $id 
    AND mh.current_revision = TRUE) AND h.current_revision = TRUE";
    
    $result = $this->db->query($sql);
    
    //Return whichever column of result you want to return or process result if you want.
    
    $result;
    }