Как оптимизировать мой запрос в Zend? - PullRequest
4 голосов
/ 22 марта 2011

Это мой простой запрос в mysql / zend:

// Get Patients
$table = new Model_Patient_DbTable();
$select = $table->select();
$select->from( 'patient' );
$select->setIntegrityCheck( false );

// insurance join                                                               
$select->joinLeft( 'insurance', 'patient.insuranceId=insurance.Id', 
                                 array( 'insName' => 'insName'));

// Get total no of records
$totalRecords = count( $table->fetchAll( $select ) );

// Filters 
if( $inactive ) {
   $select->where('patient.inactive = ?', $inactive );
}
// Other where clause conditions

// Fetch filtered patient records        
$patientRecords = $table->fetchAll( $select );

// Get total no of filtered patient records 
$filteredRecords = count( $table->fetchAll( $select ) );

В приведенном выше запросе zend я получаю записи о пациентах и ​​их страховки на основе некоторых условий в предложении where.Я должен получить (1) Общее количество записей, (2) Общее количество отфильтрованных записей, а также (3) Записи пациентов для отображения настраница интернета.

Проблема в том, что в моем приведенном выше запросе мне приходится извлекать записи 3 раза, что снижает производительность при наличии 10 000 записей.Как я могу оптимизировать свой запрос, чтобы он выбирал записи только один раз ИЛИ должен существовать отдельный запрос для подсчета, который будет получать только общее количество записей вместо выборки всех записей.

Каждый ответ будет оценен.

Спасибо, Спасибо

1 Ответ

3 голосов
/ 22 марта 2011

Как-то так должно начаться, к сожалению, у меня нет способа проверить это в настоящее время.

// Get Patients
$table = new Model_Patient_DbTable();

// Get Total records
$select = $table->select();
$select->from($table, array('COUNT(*) as row_count'));
$select->setIntegrityCheck(false);
$select->joinLeft('insurance', 'patient.insuranceId = insurance.Id', array('insName' => 'insName'));
$result = $table->fetchAll($select);
$totalRecords = $result[0]->row_count;

// Filters
if ($inactive) {
    $select->where('patient.inactive = ?', $inactive);
}

// Get Total filtered records
$result = $table->fetchAll($select);
$filteredRecords = $result[0]->row_count;

// Get filtered records
$select = $table->select();
$select->from($table);
$select->setIntegrityCheck(false);
$select->joinLeft('insurance', 'patient.insuranceId = insurance.Id', array('insName' => 'insName'));
if ($inactive) {
    $select->where('patient.inactive = ?', $inactive);
}
$patientRecords = $table->fetchAll($select);

Примечание: Возможно, вы сможете повторно использоватьтот же объект Zend_Db_Select, перезаписав $select->from() для удаления дополнения COUNT(*).

...