单独获取数据库项与使用php循环的性能比较

单独获取数据库项与使用php循环的性能比较,php,performance,Php,Performance,出于好奇,在大规模实现时,这些代码段中哪一段的性能时间更快 假设我们有一个表成员,我们想获取他们的照片 方法1 $members = $db->query('SELECT * FROM members ORDER BY id ASC'); foreach($members as $m) $memberIDs[] = $m['id']; $photos = $db->query('SELECT * FROM photos WHERE member IN'.join(',',

出于好奇,在大规模实现时,这些代码段中哪一段的性能时间更快

假设我们有一个表成员,我们想获取他们的照片

方法1

$members = $db->query('SELECT * FROM members ORDER BY id ASC');
foreach($members as $m) 
    $memberIDs[] = $m['id'];

$photos = $db->query('SELECT * FROM photos WHERE member IN'.join(',', $memberIDs).' ORDER BY id ASC');
foreach($photos as $p) {
    // multi_arr_search(search_val, search_column, search_array) returns parent key in multi dimensional array
    $memberArrayKey = multi_arr_search($p['member'], 'id', $members);
    $members[$memberArrayKey]['photos'][] = $p;
}

方法2

$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');

方法1将导致运行更少的查询,但需要更多的PHP工作。

两者都不需要。您使用的是已有15年历史的已弃用方法。 如果你想走得快,你需要PDO准备的语句。 @阿尔贝托是对的。我非常肯定,您可以使用一个SQL来执行此操作,但这里有一种方法,您可能需要考虑在OFF:

$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;
        }
    }
}

都不是。您使用的是已有15年历史的已弃用方法。 如果你想走得快,你需要PDO准备的语句。 @阿尔贝托是对的。我非常肯定,您可以使用一个SQL来执行此操作,但这里有一种方法,您可能需要考虑在OFF:

$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;
        }
    }
}

事实是:没有一个是可伸缩的。如果您使用的是大量数据集,PHP将需要相当大的内存来执行链接用户和照片的所有操作,并且将以比DB效率更低的方式执行


你应该拥有最擅长做这类事情的工具,这就是你的数据库:数据库应该加入用户和照片,并为你设置。。任何不同的做法都将意味着性能和可扩展性降低。

好吧,硬道理:没有一个是真正可扩展的。如果您使用的是大量数据集,PHP将需要相当大的内存来执行链接用户和照片的所有操作,并且将以比DB效率更低的方式执行


你应该拥有最擅长做这类事情的工具,这就是你的数据库:数据库应该加入用户和照片,并为你设置。。任何不同的操作都将意味着性能和可伸缩性的降低。

1-这取决于许多因素,如果您在每次调用时都连接或断开与数据库的连接,您如何使用MySQL。 2-MySQL服务器在同一个PHP中

理想情况下,连接1次mysql以通过单个查询检索信息。在您的情况下,您可以通过连接solucuonar。最好尽快断开连接并继续使用mysql PHP


另一个建议是不要在选择中使用“*”。只放你要工作的字段。这会消耗更少的资源,因为只请求您使用。它在内存、CPU和通过LAN的数据方面都是最佳的

1-这取决于许多因素,如果您在每次呼叫时连接和断开与数据库的连接,您如何使用MySQL。 2-MySQL服务器在同一个PHP中

理想情况下,连接1次mysql以通过单个查询检索信息。在您的情况下,您可以通过连接solucuonar。最好尽快断开连接并继续使用mysql PHP

另一个建议是不要在选择中使用“*”。只放你要工作的字段。这会消耗更少的资源,因为只请求您使用。它在内存、CPU、通过LAN的数据方面是最佳的

方法#3-在单个查询中使用联接;但绝对不是#2,因为每个查询都有开销,执行的查询越多,执行的速度就越慢。方法#3-在单个查询中使用联接;但绝对不是#2,因为每个查询都有开销,执行的查询越多,执行的速度就越慢