一个更好的方法来执行相同的SELECT查询而不是在while循环中数千次?

时间:2013-10-29 22:44:55

标签: php mysql database performance query-optimization

对于在while循环中生成的不同时间戳值,我有一个非常低效的查询运行数百/数千次。如何从while循环中获取$ start_date和$ start_date_interaval的所有不同值?

我尝试使用IN子句以及使用OR的多个WHERE进行子查询,但实质上它与单独运行查询相同。由于表包含非常大的数据集,因此速度太慢,速度太慢。我确定有一种更简单的方法,但不确定是什么。

while ($start_date <= $end_date) {

            $date_array[] = date('d/m/Y H:i:s', strtotime($start_date));

            $start_date_interval = date('Y-m-d H:i:s', strtotime($start_date) + $interval);
            echo date('d/m/Y H:i:s', strtotime($start_date)) . ' ------> ';


            $query = "SELECT COUNT(id) AS totalcalls FROM calls "
                    . "WHERE (use = 1 AND ((start_time >= '$start_date' AND start_time < '$start_date_interval') "
                    . "OR (start_time > '$start_date_past' AND start_time < '$start_date_interval' "
                    . "AND end_time >= '$start_date')));";


            $result = mysqli_query($connection, $query);

            $row = mysqli_fetch_array($result, MYSQLI_ASSOC);

            $data[] = $row['call_count'];
            echo $row["call_count"] . ' active calls.<br>';

            $start_date = date('Y-m-d H:i:s', strtotime($start_date) + $interval);
        }

2 个答案:

答案 0 :(得分:0)

如果要测试大量不同的值,1个有用的方法是使临时表加载所有不同的值。然后,您可以加入此临时表以选择所需的所有行。

如果您可以从数据库加载不同的值,它应该非常快。如果您必须上传包含1000个值的客户端数据集,则可以well-known techniques快速执行此操作。如果您不喜欢这些建议,请搜索其他人。

答案 1 :(得分:0)

如果范围是固定的,那么您可以按范围分组,创建一个将返回每个范围的记录数的查询,也许这篇文章可以帮助您:

How to select the count of values grouped by ranges