使用PHP类运行这样的mysql查询是否很糟糕?

使用PHP类运行这样的mysql查询是否很糟糕?,php,mysql,Php,Mysql,我一直在研究一些数据库(MySQL)包装类,其中很多都是这样工作的, 1) 运行sql查询 2) 在获取关联mysql数组时,他们循环搜索结果并将其添加到自己的数组中 3) 然后像下面这样运行类并循环遍历它的数组 <?php $database = new Database(); $result = $database->query('SELECT * FROM user;'); foreach ($result as $user){ echo $user->u

我一直在研究一些数据库(MySQL)包装类,其中很多都是这样工作的,
1) 运行sql查询
2) 在获取关联mysql数组时,他们循环搜索结果并将其添加到自己的数组中
3) 然后像下面这样运行类并循环遍历它的数组

<?php  
$database = new Database();

$result = $database->query('SELECT * FROM user;');

foreach ($result as $user){
    echo $user->username;
}

?>


所以我的问题是,这在高流量类型的网站上不好吗?我这样问是因为据我所知,mysql正在返回一个占用内存的数组,然后您正在从该数组构建一个新数组,然后在新数组中循环。这不是很好还是很正常?

简单的回答是:很糟糕,非常糟糕

问题是,通过对结果进行两次迭代,您将付出严重的性能损失(周期和内存!)。(如果返回了1000行呢?您将获得所有数据,循环1000次,将其保存在内存中,然后再次循环)

如果您稍微重构一下您的类,您仍然可以包装查询和获取,但是您需要在查询之外执行fetch\u数组。在这种情况下,您可以在完成后立即丢弃内存中的每一行,因此不需要存储整个结果集,只需循环一次


IIRC,PHP不会将整个MySQL结果集加载到内存中,基本上,当您调用MySQL_fetch_数组时,您需要的是集合中的下一行,该行仅在请求时加载,因此您不需要仅通过运行原始查询来为整个集合(在PHP端)支付内存开销。当您使用mysql_查询时,整个结果都会加载到内存中(感谢VolkerK),但您仍然要支付两倍的CPU成本,这可能是一个巨大的惩罚。

简单的回答是:很糟糕,非常糟糕

问题是,通过对结果进行两次迭代,您将付出严重的性能损失(周期和内存!)。(如果返回了1000行呢?您将获得所有数据,循环1000次,将其保存在内存中,然后再次循环)

如果您稍微重构一下您的类,您仍然可以包装查询和获取,但是您需要在查询之外执行fetch\u数组。在这种情况下,您可以在完成后立即丢弃内存中的每一行,因此不需要存储整个结果集,只需循环一次

IIRC,PHP不会将整个MySQL结果集加载到内存中,基本上,当您调用MySQL_fetch_数组时,您需要的是集合中的下一行,该行仅在请求时加载,因此您不需要仅通过运行原始查询来为整个集合(在PHP端)支付内存开销。当您使用mysql_query时,整个结果都会加载到内存中(感谢VolkerK),但您仍然要支付两倍的CPU成本,这可能是一个巨大的惩罚。

代码很好

foreach()只在每次传递时移动数组指针

您可以在此处阅读所有相关内容:

为了更深入地了解C语言中指针的工作原理:

没有复制任何内容,迭代几乎总是通过递增指针来执行。

代码很好

foreach()只在每次传递时移动数组指针

您可以在此处阅读所有相关内容:

为了更深入地了解C语言中指针的工作原理:


不复制任何内容,迭代几乎总是通过递增指针来执行。

这种查询非常正常。如果可以的话,最好一次只获取一行,但是对于小型和分页查询所获得的那种普通小型数据集,额外的内存利用率一点也不重要


SELECT*FROM user
,但是,如果每个用户行中都有大量用户和大量信息,那么肯定会生成一个无用的大数据集。尽量将选定的列数和行数降至最低,即您实际要在页面上输入的信息。

这种查询非常正常。如果可以的话,最好一次只获取一行,但是对于小型和分页查询所获得的那种普通小型数据集,额外的内存利用率一点也不重要


SELECT*FROM user
,但是,如果每个用户行中都有大量用户和大量信息,那么肯定会生成一个无用的大数据集。尽量将选定的列数和行数降到最低,这是您实际要放在页面上的信息。

mysql\u query()在返回之前将整个结果集传输到php进程的内存中,mysql\u unbuffer\u query()不会。这是我想的,这不是我的代码,这就是我为什么要问的原因。我认为做两次是不好的,但我经常在DB类中看到它,我想知道为什么我会在继续之前尝试获取我想要的数据并将其加载到数组中,以便所有DB操作都可以整齐地包装在try/catch块中。此外,它还加强了这些关注点的分离。使用“while($row=$mysql\u fetch\u row())”或任何将DB命令与显示逻辑混合的方法。mysql\u query()在返回之前将整个结果集传输到php进程的内存中,mysql\u unbuffer\u query()不会。这是我的想法,这不是我的代码,这就是我为什么要问的原因。我认为做两次是不好的,但我经常在DB类中看到它,我想知道为什么我会在继续之前尝试获取我想要的数据并将其加载到数组中,以便所有DB操作都可以整齐地包装在try/catch块中。此外,它还加强了这些关注点的分离。使用“while($row=$mysql\u fetch\u row())”或任何将DB命令与显示逻辑相混合的方法。您是正确的,这在高流量站点上并不好。对于一个高流量的网站来说,最好是你自己的,或者向它扔很多硬件。你是对的,在一个高流量的网站上这不好。对于一个高流量的网站来说,最好的办法就是推出自己的网站,或者投入大量的硬件。