Выполнение одного и того же запроса MYSQL в течение периодов времени в течение дня, есть ли лучший способ?

#php #mysql #database #time

#php #mysql #База данных #время

Вопрос:

Я создаю отчет для своих директоров. Это почасовая разбивка вызовов и агентов, которые регистрируются в нашей системе дозвона, чтобы мы могли видеть производительность в течение дня. С течением дня поступает все больше и больше запросов и все больше и больше результатов, что делает процесс очень медленным.

Есть ли лучший способ сделать это, чем вызывать один и тот же запрос с разными параметрами?

Один из столбцов проиндексирован, и я выбираю только его.

COUNT() Было бы быстрее, чем подсчет строк с использованием num_rows ?

Я просто не уверен, что является лучшей практикой, чтобы остановить меня от загрузки этой базы данных, а также повысить производительность.

Итак, это фрагмент этого, но я также выполняю еще 30 похожих запросов, извлекающих разные результаты из разных таблиц. Загрузка просто занимает некоторое время. Было бы лучше выбрать все на день, а затем форматировать данные с помощью PHP? Я не уверен, какой лучший способ сделать это. В приведенном ниже запросе я выбираю * но с тех пор я изменил это, чтобы просто извлекать индексированный столбец, но, похоже, это не имеет большого значения.

 $Callssql9to11 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '09:00:00') AND TIME ('11:00:00')";
    $Callssql9to11result = $conn->query($Callssql9to11);
    /////////////////11-12///////////////////////////
    $Callssql11to12 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '11:00:00') AND TIME ('12:00:00')";
    $Callssql11to12result = $conn->query($Callssql11to12);
    /////////////////12-13///////////////////////////
    $Callssql12to13 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '12:00:00') AND TIME ('13:00:00')";
    $Callssql12to13result = $conn->query($Callssql12to13);
    /////////////////13-14///////////////////////////
    $Callssql13to14 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '13:00:00') AND TIME ('14:00:00')";
    $Callssql13to14result = $conn->query($Callssql13to14);
    /////////////////14-15///////////////////////////
    $Callssql14to15 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '14:00:00') AND TIME ('15:00:00')";
    $Callssql14to15result = $conn->query($Callssql14to15);
    /////////////////15-16///////////////////////////
    $Callssql15to16 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '15:00:00') AND TIME ('16:00:00')";
    $Callssql15to16result = $conn->query($Callssql15to16);
    /////////////////16-17///////////////////////////
    $Callssql16to17 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '16:00:00') AND TIME ('17:00:00')";
    $Callssql16to17result = $conn->query($Callssql16to17);
    /////////////////17-18///////////////////////////
    $Callssql17to18 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '17:00:00') AND TIME ('18:00:00')";
    $Callssql17to18result = $conn->query($Callssql17to18);
    /////////////////18-20///////////////////////////
    $Callssql18to20 = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '19:00:00') AND TIME ('20:00:00')";
    $Callssql18to20result = $conn->query($Callssql18to20);
    /////////////////ALL///////////////////////////
    $CallssqlALL = "SELECT * FROM `outbound_log_today` WHERE `campaign_id`='003'
                        AND `call_date` BETWEEN (TIME '09:00:00') AND TIME ('20:00:00')";
    $CallssqlALLresult = $conn->query($CallssqlALL);


///////////////////9-11///////////////////////////
    $Connectssql9to11 = "SELECT * FROM `outbound_log_today`WHERE `campaign_id`='003'
                        AND `call_date`BETWEEN (TIME '09:00:00') AND TIME ('11:00:00') AND `status` IN (SELECT (STATUS) FROM `status_combined`WHERE `human_answered`='Y')";
    $Connectssql9to11result = $conn->query($Connectssql9to11);


$Leadssql9to11 = "SELECT * FROM `outbound_log_today`WHERE `campaign_id`='003'
                        AND `call_date`BETWEEN (TIME '09:00:00') AND TIME ('11:00:00')
                        AND `status`='passed'";
    $Leadssql9to11result = $conn->query($Leadssql9to11);



$Agentssql9to11 = "SELECT DISTINCT USER FROM `outbound_log_today`WHERE `campaign_id`='003'
                        AND `call_date`BETWEEN (TIME '09:00:00') AND TIME ('11:00:00') AND `user` NOT IN ('VDAD')";
    $Agentssql9to11result = $conn->query($Agentssql9to11);

/////////////////// html //////////////////////////
    <tr>
        <td></td>
        <th scope="col">9 - 11</th>
        <th scope="col">11 - 12</th>
        <th scope="col">12 - 13</th>
        <th scope="col">13 - 14</th>
        <th scope="col">14 - 15</th>
        <th scope="col">15 - 16</th>
        <th scope="col">16 - 17</th>
        <th scope="col">17 - 18</th>
        <th scope="col">18 - 19</th>
        <th scope="col">Total</th>
    </tr>
    <tr>
        <th scope="row">Calls</th>
        <td><?php echo $Callssql9to11result->num_rows; ?></td>
        <td><?php echo $Callssql11to12result->num_rows; ?></td>
        <td><?php echo $Callssql12to13result->num_rows; ?></td>
        <td><?php echo $Callssql13to14result->num_rows; ?></td>
        <td><?php echo $Callssql14to15result->num_rows; ?></td>
        <td><?php echo $Callssql15to16result->num_rows; ?></td>
        <td><?php echo $Callssql16to17result->num_rows; ?></td>
        <td><?php echo $Callssql17to18result->num_rows; ?></td>
        <td><?php echo $Callssql18to20result->num_rows; ?></td>
        <td><?php echo $CallssqlALLresult->num_rows; ?></td>
    </tr>
    <tr>
        <th scope="row">Connect%</th>
        <td><?php if($Callssql9to11result->num_rows!=0){echo number_format($Connectssql9to11result->num_rows / $Callssql9to11result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql11to12result->num_rows!=0){echo number_format($Connectsql11to12result->num_rows / $Callssql11to12result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql12to13result->num_rows!=0){echo number_format($Connectssql12to13result->num_rows / $Callssql12to13result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql13to14result->num_rows!=0){echo number_format($Connectssql13to14result->num_rows / $Callssql13to14result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql14to15result->num_rows!=0){echo number_format($Connectssql14to15result->num_rows / $Callssql14to15result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql15to16result->num_rows!=0){echo number_format($Connectssql15to16result->num_rows / $Callssql15to16result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql16to17result->num_rows!=0){echo number_format($Connectssql16to17result->num_rows / $Callssql16to17result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql17to18result->num_rows!=0){echo number_format($Connectssql17to18result->num_rows / $Callssql17to18result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Callssql18to20result->num_rows!=0){echo number_format($Connectssql18to20result->num_rows / $Callssql18to20result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($CallssqlALLresult->num_rows!=0){echo number_format($ConnectssqlALLresult->num_rows / $CallssqlALLresult->num_rows * 100, 2);}else{echo "0";} ?>%</td>
    </tr>
    <tr>
        <th scope="row">Connect</th>
        <td><?php echo $Connectssql9to11result->num_rows; ?></td>
        <td><?php echo $Connectsql11to12result->num_rows; ?></td>
        <td><?php echo $Connectssql12to13result->num_rows; ?></td>
        <td><?php echo $Connectssql13to14result->num_rows; ?></td>
        <td><?php echo $Connectssql14to15result->num_rows; ?></td>
        <td><?php echo $Connectssql15to16result->num_rows; ?></td>
        <td><?php echo $Connectssql16to17result->num_rows; ?></td>
        <td><?php echo $Connectssql17to18result->num_rows; ?></td>
        <td><?php echo $Connectssql18to20result->num_rows; ?></td>
        <td><?php echo $ConnectssqlALLresult->num_rows; ?></td>
    </tr>
    <tr>
        <th scope="row">Conv%</th>
        <td><?php if($Leadssql9to11result->num_rows!=0){echo number_format($Leadssql9to11result->num_rows / $Connectssql9to11result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadsql11to12result->num_rows!=0){echo number_format($Leadsql11to12result->num_rows / $Connectsql11to12result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql12to13result->num_rows!=0){echo number_format($Leadssql12to13result->num_rows / $Connectssql12to13result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql13to14result->num_rows!=0){echo number_format($Leadssql13to14result->num_rows / $Connectssql13to14result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql14to15result->num_rows!=0){echo number_format($Leadssql14to15result->num_rows / $Connectssql14to15result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql15to16result->num_rows!=0){echo number_format($Leadssql15to16result->num_rows / $Connectssql15to16result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql16to17result->num_rows!=0){echo number_format($Leadssql16to17result->num_rows / $Connectssql16to17result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql17to18result->num_rows!=0){echo number_format($Leadssql17to18result->num_rows / $Connectssql17to18result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($Leadssql18to20result->num_rows!=0){echo number_format($Leadssql18to20result->num_rows / $Connectssql18to20result->num_rows * 100, 2);}else{echo "0";} ?>%</td>
        <td><?php if($LeadssqlALLresult->num_rows!=0){echo number_format($LeadssqlALLresult->num_rows / $ConnectssqlALLresult->num_rows * 100, 2);}else{echo "0";} ?>%</td>
    </tr>
    <tr>
        <th scope="row">Leads</th>
        <td><?php echo $Leadssql9to11result->num_rows; ?></td>
        <td><?php echo $Leadsql11to12result->num_rows; ?></td>
        <td><?php echo $Leadssql12to13result->num_rows; ?></td>
        <td><?php echo $Leadssql13to14result->num_rows; ?></td>
        <td><?php echo $Leadssql14to15result->num_rows; ?></td>
        <td><?php echo $Leadssql15to16result->num_rows; ?></td>
        <td><?php echo $Leadssql16to17result->num_rows; ?></td>
        <td><?php echo $Leadssql17to18result->num_rows; ?></td>
        <td><?php echo $Leadssql18to20result->num_rows; ?></td>
        <td><?php echo $LeadssqlALLresult->num_rows; ?></td>
    </tr>
    <tr>
        <th scope="row">Active Agents</th>
        <td><?php echo $Agentssql9to11result->num_rows; ?></td>
        <td><?php echo $Agentsql11to12result->num_rows; ?></td>
        <td><?php echo $Agentssql12to13result->num_rows; ?></td>
        <td><?php echo $Agentssql13to14result->num_rows; ?></td>
        <td><?php echo $Agentssql14to15result->num_rows; ?></td>
        <td><?php echo $Agentssql15to16result->num_rows; ?></td>
        <td><?php echo $Agentssql16to17result->num_rows; ?></td>
        <td><?php echo $Agentssql17to18result->num_rows; ?></td>
        <td><?php echo $Agentssql18to20result->num_rows; ?></td>
        <td><?php echo $totalAgents; ?></td>
    </tr>
    <tr>
        <th scope="row">Calls Per Agent</th>
        <td><?php if($Callssql9to11result->num_rows!=0){echo number_format($Callssql9to11result->num_rows / $Agentssql9to11result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql11to12result->num_rows!=0){echo number_format($Callssql11to12result->num_rows / $Agentsql11to12result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql12to13result->num_rows!=0){echo number_format($Callssql12to13result->num_rows / $Agentssql12to13result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql13to14result->num_rows!=0){echo number_format($Callssql13to14result->num_rows / $Agentssql13to14result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql14to15result->num_rows!=0){echo number_format($Callssql14to15result->num_rows / $Agentssql14to15result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql15to16result->num_rows!=0){echo number_format($Callssql15to16result->num_rows / $Agentssql15to16result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql16to17result->num_rows!=0){echo number_format($Callssql16to17result->num_rows / $Agentssql16to17result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql17to18result->num_rows!=0){echo number_format($Callssql17to18result->num_rows / $Agentssql17to18result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Callssql18to20result->num_rows!=0){echo number_format($Callssql18to20result->num_rows / $Agentssql18to20result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($CallssqlALLresult->num_rows!=0){echo number_format($CallssqlALLresult->num_rows / $totalAgents, 2);}else{echo "0";} ?></td>
    </tr>
    <tr>
        <th scope="row">Connects Per Agent</th>
        <td><?php if($Connectssql9to11result->num_rows!=0){echo number_format($Connectssql9to11result->num_rows / $Agentssql9to11result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectsql11to12result->num_rows!=0){echo number_format($Connectsql11to12result->num_rows / $Agentsql11to12result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql12to13result->num_rows!=0){echo number_format($Connectssql12to13result->num_rows / $Agentssql12to13result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql13to14result->num_rows!=0){echo number_format($Connectssql13to14result->num_rows / $Agentssql13to14result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql14to15result->num_rows!=0){echo number_format($Connectssql14to15result->num_rows / $Agentssql14to15result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql15to16result->num_rows!=0){echo number_format($Connectssql15to16result->num_rows / $Agentssql15to16result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql16to17result->num_rows!=0){echo number_format($Connectssql16to17result->num_rows / $Agentssql16to17result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql17to18result->num_rows!=0){echo number_format($Connectssql17to18result->num_rows / $Agentssql17to18result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Connectssql18to20result->num_rows!=0){echo number_format($Connectssql18to20result->num_rows / $Agentssql18to20result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($ConnectssqlALLresult->num_rows!=0){echo number_format($ConnectssqlALLresult->num_rows / $totalAgents, 2);}else{echo "0";} ?></td>
    </tr>
    <tr>
        <th scope="row">Leads Per Agent</th>
        <td><?php if($Leadssql9to11result->num_rows!=0){echo number_format($Leadssql9to11result->num_rows / $Agentssql9to11result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadsql11to12result->num_rows!=0){echo number_format($Leadsql11to12result->num_rows / $Agentsql11to12result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql12to13result->num_rows!=0){echo number_format($Leadssql12to13result->num_rows / $Agentssql12to13result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql13to14result->num_rows!=0){echo number_format($Leadssql13to14result->num_rows / $Agentssql13to14result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql14to15result->num_rows!=0){echo number_format($Leadssql14to15result->num_rows / $Agentssql14to15result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql15to16result->num_rows!=0){echo number_format($Leadssql15to16result->num_rows / $Agentssql15to16result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql16to17result->num_rows!=0){echo number_format($Leadssql16to17result->num_rows / $Agentssql16to17result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql17to18result->num_rows!=0){echo number_format($Leadssql17to18result->num_rows / $Agentssql17to18result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($Leadssql18to20result->num_rows!=0){echo number_format($Leadssql18to20result->num_rows / $Agentssql18to20result->num_rows, 2);}else{echo "0";} ?></td>
        <td><?php if($LeadssqlALLresult->num_rows!=0){echo number_format($LeadssqlALLresult->num_rows / $totalAgents, 2);}else{echo "0";} ?></td>
    </tr>
</table>





    9 - 11  11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 Total
Calls   2677    6444    5865    72  0   0   0   0   0   15057
Connect%    5.83%   3.26%   2.59%   8.33%   0%  0%  0%  0%  0%  3.48%
Connect 156 210 152 6   0   0   0   0   0   524
Conv%   11.54%  9.05%   8.55%   0%  0%  0%  0%  0%  0%  9.54%
Leads   18  19  13  0   0   0   0   0   0   50
Active Agents   19  25  22  7   0   0   0   0   0   18.25
Calls Per Agent 140.89  257.76  266.59  10.29   0   0   0   0   0   825.04
Connects Per Agent  8.21    8.40    6.91    0.86    0   0   0   0   0   28.71
Leads Per Agent 0.95    0.76    0.59    0   0   0   0   0   0   2.74
  

Комментарии:

1. Мне не ясно, чего вы пытаетесь достичь с помощью этого sql, который вы вставили сюда. Конечно, это можно сделать в одном операторе с CASE выражением или If() функцией, и вы бы также выполнили агрегирование там, но трудно понять, как должен выглядеть ваш вывод только из SQL.

2. Итак, я обновил вопрос, чтобы отразить это. Он включает таблицу HTML. Таким образом, в таблице будут столбцы, отображающие разбивку часов в течение дня. Затем в каждой строке отображается статистика, например, размещенные вызовы, коэффициенты конверсии и т.д. Таким образом, он отображает все данные в течение этого дня с разбивкой по часам. Приблизительное представление о том, что генерирует таблица, включено в вопрос.

3. Прохладный. Теперь я это вижу. Можете ли вы поделиться только одним из ваших ConnectssqlMondayALLresult и LeadssqlMondayALLresult и AgentssqlThursdayALLresult и чем-либо еще, что я, возможно, не вижу SQL (вам не нужно делиться для каждой разбивки по времени или дню, просто чтобы мы могли видеть используемые таблицы / sql). Я подозреваю, что все это может быть сделано в одном операторе SQL (или, может быть, в 4 вершинах).

4. Извините за это, я отправлю их на вопрос сейчас для вас 🙂 Спасибо и извините за то, что я вам перезваниваю, я на самом деле сейчас на работе.

Ответ №1:

Нет необходимости запускать запрос для каждого часа

 SELECT call_date, COUNT(call_date) FROM `outbound_log_today` WHERE `campaign_id`='003'
GROUP BY call_date`
  

если я правильно понял структуру вашей таблицы, этот запрос выдаст вам количество строк для каждого call_date. Это работает, если вы округляете каждый call_date до часа, когда это происходит, а не до точной метки времени

Если у вас есть временная метка, вы можете сделать:

 SELECT HOUR(call_date), COUNT(call_date) FROM `outbound_log_today` WHERE `campaign_id`='003'
GROUP BY HOUR(call_date)`
  

HOUR() извлечет часовую часть из имеющегося у вас времени. Т. е. если у вас 09:03:00, это даст вам 09.

Каждый раз, когда вы будете запускать этот запрос, вы будете получать количество строк, которые у вас есть за каждый час, в течение которого вы выполняете запрос. Каждый раз, когда вы загружаете страницу, таблица будет заполняться обновленными значениями. Затем, основываясь на столбце даты вызова, вы можете заполнить каждую ячейку соответствующим образом.

Комментарии:

1. Фантастика, огромное вам спасибо. Я не могу поверить, что это можно сделать так просто. Большое спасибо за вашу помощь.