php - 查询100k记录表,执行时间超时

标签 php mysql arrays

每个成员都有多条记录存储在数据库中。我需要为每个用户汇总一列,并从另一列中获取最高/最低值。该表有超过 100k 条记录,一个用户可能在表中有超过 2k 条记录。

我试过这个:

$query = $mysqli->query("SELECT DISTINCT `id` FROM `table`");

if($query){
  $IDs = new SplFixedArray($query->num_rows);
  $IDs = $query->fetch_all();
  unset($query, $row);


  set_time_limit(300);
  foreach ($IDs as $key => $value) {
    $query = $mysqli->query("SELECT SUM(price), dtime FROM `table` WHERE `id` = '".$value[0]."' ORDER BY dtime DESC");
    if($query){
      $row = $query->fetch_assoc();
      print_r($row);
    }
  }

但是将时间限制设置为 300 真的是正确的做法吗?我还尝试了一个准备好的语句,只在循环中分配 ID,以及其他几件事。所有这些都没有像我希望的那样工作。

最佳答案

100k 的记录确实不多,这个查询应该没有理由超过 5 分钟。

与其获取不同的 ID 列表并遍历它们,为每个 ID 查询这些值,不如一次完成所有操作,然后遍历您的结果以执行您需要的操作。

select 
  `id`, 
  sum(`price`) as `sum_price`, 
  min(`dtime`) as `min_dtime`, 
  max(`dtime`) as `max_dtime` 
from 
  `table` 
group by 
  `id`

(假设您需要获取最小值和最大值的“其他字段”是 dtime)

虽然我在 PHP 方面并不强,但从 SQL 的角度来看,以这种方式做事要快得多。

关于php - 查询100k记录表,执行时间超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45339855/

相关文章:

php - 跨多个表的 MySQL 查询问题

php - 分析网络服务器的建议

mysql - SQL:为每个类别获取一篇文章

php - 如何截断从 MySQL 数据库中获取的文本并附加省略号?

Java 数组响应而不是括号

java - JSON - 对象数组中的对象数组

php - 动态数据驱动的用户界面

php - 使用 MySQL 关系表循环行

javascript - 将属性添加到数组中的最新对象

php - 使用xampp的php mysql连接出错