出于好奇,这些代码段中的哪一段在大规模实施时会有更快的性能时间?
我们假设我们有一个桌子成员,我们想要他们的照片。
方法1
$members = $db->query('SELECT * FROM members ORDER BY id ASC');
foreach($members as $k=>$m)
$members[$k]['photos'] = $db->query('SELECT * FROM photos WHERE member='.$m['id'].' ORDER BY id ASC');
OR
方法2
class Loop
{
private $lockFile;
public static function getLockFile($address)
{
return sys_get_temp_dir().'/'.strtr($address, '.:', '--').'.pid';
}
public function __construct($address)
{
$this->lockFile = Loop::getLockFile($address);
touch($this->lockFile);
//...
}
public function run()
{
$this->running = true;
while ($this->running) {
if (!file_exists($this->lockFile)) {
$this->running = false;
echo "File Removed";
}
//...
}
}
public function stop()
{
$this->running = false;
unlink($this->lockFile);
}
}
方法1会导致运行的查询更少,但需要更多的PHP工作。
答案 0 :(得分:2)
两者都不是。您使用的是15年前弃用的方法。 如果你想快速,你需要PDO准备好的语句。 @alberto是对的。我很确定,你可以有一个也只有sql来执行此操作,但这里有一种你可能想要考虑以防万一的方式:
$showError = true;
define("SQLHOST", "127.0.0.1");
define("SQLUSER", "login");
define("SQLPASS", "password");
define("SQLSGBD", "database");
$conn = new PDO('mysql:host=' . SQLHOST . ';dbname=' . SQLSGBD . ';charset=UTF8', SQLUSER, SQLPASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql1 = 'SELECT * FROM members ORDER BY id ASC';
$stmt1 = $conn->prepare($sql1);
$sql2 = 'SELECT * FROM photos WHERE member IN ? ORDER BY id ASC';
$stmt2 = $conn->prepare($sql2);
try {
$stmt1->execute();
$members = $stmt1->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
if ($showError === true) {
var_dump("error query 1:" . __LINE__ . "-------" . __FUNCTION__ . "-------" . $e->getMessage());
exit;
}
}
if (count($members) !== 0) {
$memberIDs = array();
foreach ($members as $m) {
$memberIDs[] = $m['id'];
}
$memberlist = join(',', $memberIDs);
foreach ($members as $memberArrayKey => $result1) {
$stmt2->bindParam(1, $memberlist, PDO::PARAM_STR);
try {
$stmt2->execute();
$photos = $stmt2->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
if ($showError === true) {
var_dump("error query 2:" . __LINE__ . "-------" . __FUNCTION__ . "-------" . $e->getMessage());
exit;
}
}
if (count($photos) !== 0) {
$memberArrayKey = multi_arr_search($p['member'], 'id', $members);
$members[$memberArrayKey]['photos'][] = $p;
}
}
}
答案 1 :(得分:1)
嗯,说实话:实际上没有一个可扩展。如果您正在处理大量数据,PHP将需要相当多的内存来执行链接用户和照片的所有操作,并且将以比DB更低效的方式执行此操作。
你应该拥有最适合做这类事情的工具,这就是你的数据库:数据库应该加入用户&照片并为您设置..你做的任何不同的事情都意味着降低性能和可扩展性。
答案 2 :(得分:1)
1 - 如果您在每次通话时连接并断开与DB的连接,这取决于许多因素如何使用MySQL。 2 - MySQL服务器位于同一个PHP中。
理想情况下,连接1次mysql以通过单个查询检索信息。在您的情况下,您可以使用JOIN进行解决。最好断开连接尽快并继续使用MySQL PHP。
另一个建议是不要在 SELECT 中使用“*”。只放置你去的工作领域。这会占用更少的资源,因为只需要您使用。它在内存,CPU,通过LAN的数据
中是最佳的