多少数据对于PDO fetchAll()来说是太多的


How much data is too much for PDO fetchAll()

我已经在这里搜索了,但是用我能想到的搜索条件找不到任何东西。这里可能有另一个帖子可以回答我的问题,但我没有找到任何。

PHP手册规定:

使用此方法获取大型结果集将导致大量的对系统和网络资源的需求

它还说你应该使用WHERE和ORDER BY来减轻负载,这是完全有道理的。但这仍然没有回答问题,多少才算太多?如何定义一个太大的结果集?

例如,我为我正在创建的类编写了以下代码:
public function getQuestions($quiz_id){
        $quiz_id = parent::onlyNums($quiz_id);
        $stmt = $this->db->prepare(
                        "SELECT quiz.title, quiz.description, questions.question,
                         questions.answer, questions.wrong_one, questions.wrong_two,
                         questions.wrong_three FROM quiz, questions WHERE 
                         questions.quiz_id = :quiz_id AND quiz.id = questions.quiz_id");
                $stmt->bindValue(':quiz_id',$quiz_id,PDO::PARAM_INT);
                try
                {
                    $stmt->execute();
                    if($stmt->rowCount() > 0 )
                    {
                        return $stmt->fetchAll(PDO::FETCH_ASSOC);
                    }else{
                        echo "No Items match the query";
                        exit();
                    }
                }
                catch(PDOException $e)
                {
                    return $e->getMessage();
                }
    }

现在,对于我正在构建的应用程序,我不希望这个查询检索大量的结果,因为由于应用程序的性质,不应该有那么多。但是在某些时候,如果有人发疯了,在单个测验中添加了数百万个问题,这个脚本会失败吗?

谢谢你的建议。

我不认为有太多的固定大小。这实际上取决于您正在运行的硬件/网络。与使用小型EC2实例相比,您可以在具有100GB RAM的专用服务器上处理更大的数据集。但是,您应该始终努力使查询尽可能高效,并且只返回当前操作所需的行。

这个警告实际上不是在fetchAll()上的,而是在一般情况下的

实际上,这个函数只是简单地循环查询结果并将其添加到数组中的语法糖。因此,如果有数百万个问题,您的页面肯定会崩溃,虽然不是因为fetchAll()而是因为数据量。

所以,对于一般的网页,使用这个函数是可以的。
但是在一些基于cron的数据挖掘脚本的情况下,使用它是不明智的—创建一个循环并逐个处理每一行,而不是将它们存储到数组中。

检查的一种方法是使用限制,比如运行10个文件,每个文件都有不同的限制。首先是1000,然后是2000,然后是3000,然后看看什么时候会出现错误。你会从中得到启发。