这是我在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条记录时降低性能。如何优化我的查询,它只获取记录一次或者应该有一个单独的计数查询,只会获得记录总数而不是获取所有记录。
我们将不胜感激。
由于 感谢
答案 0 :(得分:3)
这样的事情应该让你开始,不幸的是我目前没有办法测试这个。
// 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(*)
对象。