2016-06-01 11 views
0

好奇心の喪失から、これらのコードセグメントのどれが、大規模に実装された場合、パフォーマンス時間が短縮されますか?DBアイテムを個別に取得するパフォーマンスとPHPをループするの比較

テーブルメンバーがいて、写真を取得したいとします。

方法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; 
} 

OR

方法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の作業が必要となるでしょう。

+1

方法3 - 単一のクエリでJOINを使用します。しかし、間違いなく#2ではなく、クエリごとにオーバーヘッドがあるため、より多くのクエリを実行するほど遅くなります。 –

答えて

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

まあ、ハード真実:どれも実際にスケーラブルではありません。大量のデータを扱う場合、PHPはユーザと写真をリンクするためのすべての操作を実行するためにかなりのメモリを必要とし、DBよりもはるかに非効率的な方法で行います。

あなたのDBは、あなたのDBであるこれらの種類のものを実行するのに最適なツールを持っている必要があります:DBはユーザー&の写真に参加し、そのセットを取得する必要があります。スケーラビリティ。

1

各呼び出しでDBに接続して接続を切断すると、MySQLをどのように操作するかによって多くの要素が異なります。 MySQLサーバは同じPHPです。

理想的には、1回のクエリmysqlを使用して、単一のクエリで情報を取得します。あなたの場合、あなたはと一緒にsolucuonarすることができます。できるだけ早く切断し、MySQL PHPを続けるのがベストです。

には、「*」を使用しないことをお勧めします。あなたが仕事に行くフィールドだけを置きます。あなただけが使用されるので、これはより少ないリソースを食べます。 メモリ、CPU、LAN経由のデータ

関連する問題