我有以下代码
$Model_Shifts = new Model_Shifts();
$shifts = $Model_Shifts->getShiftIDs($condition->schedule_id);
$Model_Tasks = new Model_Tasks();
$tasks = $Model_Tasks->getTasksByShiftIDsPositionID($shifts, $condition->position_id, $time);
return count($tasks);
我的Model_Shifts->getShiftIDs()
如下
public function getShiftIDs($schedule_id)
{
$row = $this->fetchAll(
$this->select()
->from($this->_name, 'id' )
->where('schedule_id = ?', $schedule_id)
);
return $row->toArray();
}
我的$Model_Tasks->getTasksByShiftIDsPositionID
是以下
public function getTasksByShiftIDsPositionID( $shift_ids, $position_id, $time)
{
return $this->fetchAll($this->select()
->where('shift_id IN (?)', $shift_ids)
->where('position_id = ?', $position_id)
->where('time_start <= ?', $time)
->where('time_end > ?', $time)
);
}
这运行得非常慢!加载大约需要5秒钟。我的数据库根本不大。我正在运行什么操作会导致这么慢?
我知道正是这段代码导致服务器运行缓慢。我对代码进行了评论,然后代码在10毫秒内运行。
编辑: - time_start和time_end在我的数据库中是(int 4)。 - 我用microtime来计算每个函数的使用时间。粗略地说,这两个函数中的每一个都花费了一半的时间(所以2.5秒)。
答案 0 :(得分:0)
如果您只需要getTasksByShiftIDsPositionID
函数中的任务计数,请更新您的查询以仅返回计数。
它比获取所有行然后计数
public function getShiftIDs($schedule_id)
{
$row = $this->fetchAll(
$this->select()
->from($this->_name, 'id' )
->where('schedule_id = ?', $schedule_id)
);
return $row->__toString();
}
public function getTasksByShiftIDsPositionID( $shift_ids, $position_id, $time)
{
$select = $this->select()
->from($this->_name, array('COUNT(shift_id) AS shiftcount'))
->where('shift_id IN (?)', $shift_ids)
->where('position_id = ?', $position_id)
->where('time_start <= ?', $time)
->where('time_end > ?', $time);
$result = $this->fetchRow($select)
return $result->shiftcount;
}
或者您可以使用连接条件连接两个表并使用where条件来过滤结果
$Model_Shifts = new Model_Shifts();
$shiftCount = $Model_Shifts->getShiftCount($condition->schedule_id,$condition->position_id, $time);
public function getShiftCount($schedule_id,$position_id, $time)
{
$select = $this->select()
->from($this->_name, array('COUNT(shift_id) AS shiftcount'))
->join(array('task'=>'shift_task'),$this->_name.'.id=task.shift_id', array())
->where('position_id = ?', $position_id)
->where('time_start <= ?', $time)
->where('time_end > ?', $time)
->where('schedule_id = ?', $schedule_id)
$result = $this->fetchRow($select)
return $result->shiftcount;
}
答案 1 :(得分:0)
组合查询并在查询中使用count而不是php提高速度。
function getAmountOfTasks($schedule_id){
$stmtA = $this->select()
->from($this->_name, 'id' )
->where('schedule_id = ?', $schedule_id);
$data = $this->fetchRow($this->select()
->from($this->_name, 'COUNT(*)' ) //probably need to change $this->_name here
->where('shift_id IN (?)', $stmtA)
->where('position_id = ?', $position_id)
->where('time_start <= ?', $time)
->where('time_end > ?', $time)
);
return $data[0];
}
答案 2 :(得分:0)
我同意那些说要结合你的疑问的人。 “shift_id IN(?)”非常慢,可能就是你遇到的问题。 另外,在“Where”子句中经常使用的字段添加索引会大大提高速度。