每个成员都有多条记录存储在数据库中。我需要为每个用户汇总一列,并从另一列中获取最高/最低值。该表有超过 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/