php - 使用 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->username;
}

?>

所以我的问题是,这对于高流量类型的网站来说不是很好吗?我问这个问题是因为据我所知,mysql正在返回一个消耗内存的数组,然后您将从该数组构建一个新数组,然后循环访问该新数组。这是不好还是很正常?

最佳答案

简短的回答是:这很糟糕,非常糟糕。

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

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

IIRC,PHP 不会将整个 MySQL 结果集加载到内存中,基本上,当您调用 mysql_fetch_array 时,您正在请求集合中的下一行,该行仅在请求时才加载,因此您仅通过运行原始查询,不需要支付全套(在 PHP 方面)的内存占用。 当您使用 mysql_query 时,整个结果会加载到内存中(感谢 VolkerK),但您仍然需要付费CPU 的成本是两倍,这可能是一笔巨大的损失。

关于php - 使用 PHP 类来运行 mysql 查询这样不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032108/

相关文章:

php - 运行 linux 命令以通过 PHP 输出到文本文件

php - Mysql命令按街道名称然后编号对地址进行排序

mysql - 如何在 ruby​​ dbi 中的 3307 端口连接到 MySQL

php - 仅在 mysql 数据库中插入一次。

php - MYSQL : GROUP BY issues With ORDER BY

javascript - 如何在 javascript 中使用 <select> 标签 id。当 id 是 PHP 数组?

php - Paypal 沙盒 - 错误 10002 : You do not have permission to make this API call

php - 关于某些模板的数组排列

MySQL 错误 1064 LOAD DATA LOCAL INFILE 语法不正确

mysql - 从 SQL 结果中删除重复项并显示其他列