gpt4 book ai didi

php - 多数据库查询感知性能

转载 作者:搜寻专家 更新时间:2023-10-30 23:47:34 25 4
gpt4 key购买 nike

假设有一个 SQLite 数据库有两个表,“users”和“ranks”,一个包含用户名和他们的排名作为数字(和 userid),另一个包含相同的排名数字和排名名称。目标是输出一个包含等级名称和用户名(及其用户 ID)的 html 表。

<?php
$db1 = new PDO('sqlite:database');
$db2 = new SQLite3('database');
$result = $db1->query("SELECT * FROM users ORDER BY rank DESC");

echo '<table><tr><td>rank</td><td>username</td><td>id</td></tr>';
$data = "";
foreach($result as $row){
$data .=
'<tr><td>'.$db2->querySingle("SELECT rankname FROM ranks WHERE ranknumber =".$row['rank']).'</td>'.
'<td>'.$row['name'].'</td>'.
'<td>'.$row['id'].'</td></tr>';
}
echo $data;
echo "</table>";
?>

此代码在小范围内工作得很好,问题是一旦数据库高度填充时它的性能。本质上,它是为第一个查询的每个输出行向数据库发出新请求,对吧?我添加了 $data 的使用,而不是逐行回显,以防万一它可能会以某种方式减少沿途某处的请求,但我不确定它是否会产生任何积极的影响。我对数据库处理和 php 太缺乏经验,不知道与简单地并排使用 2 个查询相比,这段代码会给服务器和/或网络带来多大的压力,我的代码是否会执行数百个(如果不是数千个)数据库请求,以及如何执行这会影响性能吗?另外,如果它不好,我该怎么办?是否有任何不同的方法可以在不出现性能问题的情况下实现相同的结果?

更重要的是,如果我还用来自完全不同的非 SQLite (MySQL) 数据库的显示名称替换用户名会怎么样? 201 个查询显示 100 个用户,这是否意味着资源使用量成倍增加?

最佳答案

根据一般经验,发出查询是一项代价高昂的操作 - 它涉及数据库端的大量工作(解析、语法检查、权限检查、构建执行计划、磁盘 I/O、网络流量到以及来自数据库等)。

当然,没有规则是 100% 无懈可击的,您应该始终对您的特定用例进行基准测试,但在大多数情况下,执行单个“大”查询比执行 N 个“小”查询要好得多。在您的用例中,您可以使用 join 语法在单个查询中获取所需的所有结果:

SELECT   users.*, ranks.rankname
FROM users
JOIN ranks ON users.rank = ranks.ranknumber
ORDER BY users.rank DESC

关于php - 多数据库查询感知性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com