Оптимизация SQL запроса 2 часть

Пятница, 30 Сен 2011 12:54

 
Если вы выполните представленный выше блок кода, состоящий из пары MySQL запросов и пары циклов while, то получите то, что ожидалось – список всех людей, с их любимыми цветами, показанными внизу. Так в чем же проблема?
В чем заключена проблема
Основная проблема в вышеприведенном выше фрагменте PHP кода сводится к тому, что запрос расположен внутри цикла while. Это означает, что при каждом выполнении цикла выполняется отдельный SQL-запрос. Конечно в данном примере у нас только 4 человека и всего несколько цветов, поэтому вы не заметите никакой разницы в быстродействии. Представьте что это часть большой системы, в которой содержится более 10 тысяч человек. Учитывая, что для каждого человека в таблице будет выполняться новый SQL-запрос, это приведет к выполнению огромного количества запросов, что не желательно.
Большое количество запросов нарушит работу веб-приложения и может привести к зависанию. При достаточно большом количестве данных в таблицах или людей, одновременно обращающихся к этому сценарию, работа приложения быстро станет очень медленной.
Что следует сделать
Решение является очень простым. В приведенном выше примере с четырьмя людьми в таблице, в общей сложности будет выполнено пять запросов – один для получения списка всех людей,  а затем выполнение запроса для каждого человека. Следующий подход позволяет выполнять только два запроса. Преимущество заключается в том, что независимо от того, сколько у вас человек, 4 или 4000 всегда будут выполняться только два запроса.
// Запрос на получение всех записей о людях
$queryPeople = mysql_query("SELECT * FROM person") or die(mysql_error());
// Обработать в цикле каждую запись
while($person = mysql_fetch_array($queryPeople))
{
// Записать каждого человека в массив, используя ID в качестве ключа массива
$arrayPeople[$person['ID']] = $person;
}
// Запрос на получение цветов
$queryColours = mysql_query("SELECT * FROM colour");
while($colour = mysql_fetch_array($queryColours))
{
// Присоединяем цвет к массиву $arrayPeople
// Это возможно, потому что нам известен personID из таблицы colour
$arrayPeople[$colour['personID']]['colours'][] = $colour;
}
// Обрабатываем каждого человека в цикле
foreach($arrayPeople AS $person)
{
// Выводим имена людей
echo "

" . $person['name'] . "


";
// Обрабатываем в цикле каждый цвет
foreach($person['colours'] AS $colour)
{
// Выводим цвет
echo $colour['colour'] . "
";
}
}
Теперь посмотрим что происходит. Вместо выполнения запроса для получения цвета отдельного человека каждый раз в цикле while, мы получаем каждый цвет независимо от того кому он принадлежит, прежде чем цикл начнется. Первое, на что следует обратить внимание, это то, где обрабатываются люди с помощью цикла while. Внутри этого цикла мы создаем массив $arrayPeople, который содержит список всех людей. Каждый раз при добавлении нового человека устанавливается ключ элемента массива равным идентификатору пользователя.
Затем обрабатываем в цикле все цвета, которые можно присвоить нужному человеку, поскольку известен PersonID из таблицы colour. Это означает, что для каждого человека, у которого есть один или несколько цветов, существует элемент в массиве, который содержит все его цвета.
Конечный результат тот же самый, но понадобилось на 3 запроса меньше. Это означает,  что на 100 человек в таблице будет выполнено на 99 запросов меньше.

 

Информация взята с сайта bitsofphp.com

Традиционный анекдот от сео-семки:

Мне из ГАИ прислали фотографию с видеокамеры, которая засекла, как я превысил  скорость. Отослал им видео, как я оплачиваю штраф гаишнику наличными на месте.

1 2

 

    Подпишитесь на комментарии, чтобы не пропустить
    важный ответ:



подписка на rss RSS - подписка
    подписка twitter Twitter - подписка

Вы можете оставить отзыв или трекбек со своего сайта.
Теги: , ,

комментария 3 на «Оптимизация SQL запроса 2 часть»

  1. Alik пишет:

    17 Дек 2011 в 13:30

    Про ГАИ прикольно, но видимо баян

  2. Пипец пишет:

    13 Янв 2012 в 13:11

    А ты что сюда зашел, анекдоты читать или про партнерские программы почитать?

  3. Dima пишет:

    01 Апр 2014 в 23:17

    могу посоветовать отличную программу для оптимизации и ускорения работы операционной системы, чистка от мусора, чистка реестра и другие функции - Ashampoo WinOptimizer 11 вот ссылка для скачивания dfiles.ru/files/qpcahmuvo

Ваш отзыв

https://seo-semki.ru/icons/wpml_bye.gif 
https://seo-semki.ru/icons/wpml_good.gif 
https://seo-semki.ru/icons/wpml_negative.gif 
https://seo-semki.ru/icons/wpml_scratch.gif 
https://seo-semki.ru/icons/wpml_wacko.gif 
https://seo-semki.ru/icons/wpml_yahoo.gif 
https://seo-semki.ru/icons/wpml_cool.gif 
https://seo-semki.ru/icons/wpml_heart.gif 
https://seo-semki.ru/icons/wpml_rose.gif 
https://seo-semki.ru/icons/wpml_smile.gif 
https://seo-semki.ru/icons/wpml_whistle3.gif 
https://seo-semki.ru/icons/wpml_yes.gif 
https://seo-semki.ru/icons/wpml_cry.gif 
https://seo-semki.ru/icons/wpml_mail.gif 
https://seo-semki.ru/icons/wpml_sad.gif 
https://seo-semki.ru/icons/wpml_unsure.gif 
https://seo-semki.ru/icons/wpml_wink.gif