3

我有以下代码

$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)。- 我使用微时间来计算每个函数需要多长时间。粗略地说,这两个函数中的每一个都需要一半的时间(即 2.5 秒)。

4

3 回答 3

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;
}
于 2013-08-21T04:22:32.583 回答
0

结合查询并在查询中使用计数而不是 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];
}
于 2013-08-21T09:40:53.407 回答
0

我同意那些说要结合您的查询的人。“shift_id IN (?)” 非常慢,可能这就是您遇到的问题。此外,将索引添加到您经常在“Where”子句中使用的字段将大大提高速度。

于 2013-12-18T02:07:58.277 回答