2016-06-01 2 views
0

Из любопытства, какой из этих сегментов кода будет иметь более быстрое время выполнения при реализации в массовом масштабе?Производительность выборки элементов БД индивидуально против петли с помощью 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; 
} 

ИЛИ

Метод 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 потребует довольно много памяти для выполнения всех операций по связыванию пользователей и фотографий и сделает это гораздо более неэффективным способом, чем БД.

У вас должен быть тот инструмент, который у вас есть, что лучше всего делать при таких вещах, что является вашей БД: БД должна присоединиться к фотографиям пользователей & и получить этот набор. Все, что вы делаете по-разному, будет означать снижение производительности и масштабируемость.

1

Это зависит от многих факторов, как вы работаете с MySQL, если вы подключаете и отключаете соединение с БД при каждом вызове. 2- Сервер MySQL находится в одном PHP.

В идеале, подключите 1 раз mysql для получения информации с помощью одного запроса. И в вашем случае вы можете solucuonar с ПРИСОЕДИНЯЙТЕСЬ. Что лучше всего отключить как можно быстрее и продолжить с MySQL PHP.

Другая рекомендация состоит в том, чтобы не использовать "*" в ВЫБРАТЬ. Только помещает поля, которые вы идете на работу. Это потребляет меньше ресурсов, потому что запрашивается только вы. Он оптимален в Память, ЦП, данные по локальной сети

Смежные вопросы