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

时间:2016-06-01 23:05:50

标签: php performance

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

我们假设我们有一个桌子成员,我们想要他们的照片。

方法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工作。

3 个答案:

答案 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的​​数据

中是最佳的