0

こんにちは皆さん、私はこのクエリを持っていますが、非常に遅いです。コードを理解できる場合、2 つのクエリを 1 つに結合する方法、またはこのクエリを高速化する方法を教えてください。

これがコードです

$strSQL  = "SELECT user_status_history.*, queues_config.extension FROM user_status_history ";
    $strSQL .= "LEFT JOIN queues_config ON user_status_history.skillset = REPLACE(queues_config.grppre, \":\", \"\") ";
    $strSQL .= "WHERE user_status_history.status_id = 9 "; # outbound call
    $strSQL .= "AND DATE_FORMAT(status_time, '%Y-%m-%d') = '$check_date' ";
    if ($i==1)
        $strSQL .= "AND TIME_FORMAT(status_time, '%H:%i') >= '$cboHrFrom:$cboMinFrom' ";
    else if (strtotime($check_date) == strtotime($end_date))
        $strSQL .= "AND TIME_FORMAT(status_time, '%H:%i') <= '$cboHrTo:$cboMinTo' ";
    $strSQL .= "AND queues_config.extension = '$cboSkillSet' ";
    if ($cboGroup!='' && $strAgentGroup!='') $strSQL .= "AND user_status_history.user_id IN (".$strAgentGroup.") ";
    $strSQL .= "ORDER BY user_status_history.user_id, user_status_history.status_time ";
    $rs2     = &$cn->Execute($strSQL);
    while (!$rs2->EOF)
    {
        $strSQL  = "SELECT status_time, time_to_sec(timediff(status_time, '".$rs2->fields['status_time']."')) AS timesecs FROM user_status_history ";
        $strSQL .= "LEFT JOIN queues_config ON user_status_history.skillset = REPLACE(queues_config.grppre, \":\", \"\") ";
        $strSQL .= "WHERE status_time > '".$rs2->fields['status_time']."' ";
        $strSQL .= "AND user_id = '".$rs2->fields['user_id']."' ";
        $strSQL .= "AND queues_config.extension = '".$rs2->fields['extension']."' ";
        $strSQL .= "ORDER BY status_time LIMIT 1;";
        $rs3     = &$cn->Execute($strSQL);
        if (!$rs3->EOF)
        {
            $sum_talk_sec = $sum_talk_sec + $rs3->fields['timesecs'];
        }
        $rs3->Close();

        $rs2->MoveNext();
    }
    $rs2->Close();
4

1 に答える 1

0

1

のテーブルインデックスがあることを確認してください

user_status_history.status_id

user_status_history.user_id

2

これらはオプティマイザにとって困難です。これらを取り除いてみてください

LEFT JOIN queues_config ON user_status_history.skillset = REPLACE(queues_config.grppre, \":\", \"\") ";
LEFT JOIN queues_config ON user_status_history.skillset = REPLACE(queues_config.grppre, \":\", \"\") ";

3

ループ クエリを取り除きます。すべての ID を query1 から配列にフェッチし、それらすべてに対して 1 つのクエリを作成します。

"SELECT user_id, status_time, time_to_sec(timediff(status_time, '".$rs2->fields['status_time']."')) AS timessecs FROM user_status_history "; ... AND user_id IN (id1, id2, id3 ... )

4 (DCOder から)

これらを逆に変換します。PHP を使用して、mysql 日時フィールドを作成します。

    $strSQL .= "AND DATE_FORMAT(status_time, '%Y-%m-%d') = '$check_date' ";

-- > 
    preg_match('/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$/', $check_date, $regs );
    $enddate = date('Y-m-d', mktime( $hour=6, $min=0, $sec=0, $mon=$regs[2], $day=$regs[3]+1, $year=$regs[1] ));
    $strSQL .= " AND status_time > '$check_date' AND status_time <= '$enddate' ; 


    $strSQL .= "AND TIME_FORMAT(status_time, '%H:%i') >= '$cboHrFrom:$cboMinFrom' ";

-- >  $strSQL .= " AND status_time >= '$check_date $cboHrFrom:$cboMinFrom:00' ";

    $strSQL .= "AND TIME_FORMAT(status_time, '%H:%i') <= '$cboHrTo:$cboMinTo' ";

-- >  $strSQL .= " AND status_time <= '$check_date $cboHrTo:$cboMinTo:59' ";
于 2012-09-21T05:46:56.423 に答える