2016-06-01 2 views
0

Aus Neugier, welche dieser Codeabschnitte hätten die schnellere Leistungszeit, wenn sie in großem Umfang implementiert würden?Leistung des Abrufs von DB-Elementen einzeln im Vergleich zu einer Schleife mit PHP

Sagen wir, wir haben einen Tisch Mitglieder und wir wollen ihre Fotos holen.

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

ODER

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

Methode 1 in weniger Anfragen zu sein RAN führen würde, aber mehr PHP Arbeit erfordert.

+1

Methode # 3 - Verwenden Sie einen JOIN in einer einzigen Abfrage; aber definitiv nicht # 2, weil es pro Abfrage einen Overhead gibt, und je mehr Abfragen ausgeführt werden, desto langsamer wird es sein –

Antwort

2

weder. Sie verwenden 15 Jahre alte veraltete Methoden. Wenn Sie schnell gehen wollen, brauchen Sie PDO vorbereitete Anweisungen. @alberto hat Recht. Ich bin mir ziemlich sicher, können Sie und nur SQL müssen diese durchführen, aber hier ist ein Weg, Sie vielleicht für den Fall zu prüfen, aus:

$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

Nun, harte Wahrheit: keine ist eigentlich skalierbar. Wenn Sie mit großen Datenmengen arbeiten, benötigt PHP ziemlich viel Speicher, um alle Vorgänge zum Verknüpfen von Benutzern und Fotos durchzuführen, und wird dies in einer viel ineffizienteren Weise als die DB tun.

Sie sollten das Werkzeug haben, das am besten ist, diese Art von Dingen zu tun, die Ihre DB ist: die DB sollte den Benutzern & Fotos beitreten und Sie das Set bekommen .. alles, was Sie anders machen, bedeutet reduzierte Leistung und Skalierbarkeit.

1

1- Es hängt von vielen Faktoren ab, wie Sie mit MySQL arbeiten, wenn Sie bei jedem Aufruf eine Verbindung zur DB herstellen und trennen. 2- MySQL Server ist in der gleichen PHP.

Im Idealfall verbinden Sie 1 mal mysql, um Informationen mit einer einzigen Abfrage abzurufen. Und in Ihrem Fall können Sie Solucuonar mit einem JOIN. Es ist am besten, so schnell wie möglich die Verbindung zu trennen und mit MySQL PHP fortzufahren.

Eine weitere Empfehlung ist, "*" im SELECT nicht zu verwenden. Legt nur die Felder an, die Sie zur Arbeit gehen. Das Essen weniger Ressourcen, weil nur Sie verwenden, angefordert wird. Es ist optimal in Speicher, CPU, Daten über LAN

Verwandte Themen