За последние 24 часа нас посетили 45623 программиста и 1273 робота. Сейчас ищут 1136 программистов ...

Лишние запросы к БД или массивы?

Тема в разделе "PHP для новичков", создана пользователем Freakmeister, 12 дек 2010.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Наметил писать портал, хочется изначально выбрать грамотный алгоритм его работы, чтобы в конечном итоге портал работал быстро. Допустим, я вывожу блок с комментариями к новости, всего там 9 комментариев. Как это сделать грамотней? Засунуть в цикл запрос к БД, чтобы в итоге было 9 обращений к БД, отдельно для каждого комментария, или лучше вытащить сразу все комментарии одним запросом, засунуть их в массив, и уже из массива выводить в цикле?

    И вообще, есть ли разница, сделать 9 запросов к БД, вытаскивая по одной записи, или сделать один запрос и вытащить сразу 9?
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Разница есть, делать 1 запрос на выборку записей по данной новости. Сразу всместе с инфой о пользователях, которые эти комменты напостили, есть таковая инфа имеется :)
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Ну это понятно, там будет несколько массивов - с текстами, авторами, датами. Просто для примера я рассматриваю один.

    А ничего, если там будет например 50 комментариев и некоторые из них грамосткие? Ведь наличие в коде таких толстых массивов из 50 элементов загрузит аперативку на хостинге на сколько-то там ещё килобайт?) Не говоря уже о том, что в коде появится второй цикл.

    Вот как я себе это представляю:
    * Без массивов - цикл выполняется всего один раз, внутри которого происходит 9 запросов к БД и вывод результатов.
    * С массивами - сначала выполняется первый цикл, который заносит результат обращения к БД в массив. Потом выполняется второй цикл, который выводит результат из массива.

    Вот и даже хз, что выбрать из двух зол. :)
     
  4. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Freakmeister
    9 запросов к базе данных да ещё внутри цикла -- зло!
     
  5. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    SQL позволяет брать данные из нескольких таблиц, ответ тот же - один запрос однозначно.
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Один цикл можно сделать и во втором случае. Вот например как-то так
    PHP:
    1. <?php
    2. // подключились к б.д., всё такое
    3. $sql = "SELECT `comments`.`title`, `comments`.`text`, `users`.`username` FROM `comments` LEFT JOIN `users` USING(`user_id`) WHERE `comments`.`theme_id` = {$themeId} LIMIT {$start}, {$perPage}";
    4. $result = mysql_query($sql, $dblink);
    5. if($result and mysql_num_rows($result) > 0) {
    6.    while($row = mysql_fetch_assoc($result)) {
    7.       if(empty($row['username'])
    8.          $row['username'] = 'Гость';
    9. ?>
    10. <div>
    11.    <b><?php echo($row['title']); ?></b><br />
    12.    Пользователь: <?php echo(htmlspecialchars($row['username'])); ?><br />
    13.    <?php echo(nl2br(htmlspecialchars($row['text']))); ?><br />
    14. </div>
    15. <hr />
    16. <?php
    17.    }
    18. } else {
    19.    echo('Пока ещё нет комментариев');
    20. }
    21. ?>