Оптимизация 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
Читать похожие статьи:
Подпишитесь на комментарии, чтобы не пропустить
важный ответ:


Alik пишет:
17 Дек 2011 в 13:30
Про ГАИ прикольно, но видимо баян
Пипец пишет:
13 Янв 2012 в 13:11
А ты что сюда зашел, анекдоты читать или про партнерские программы почитать?
Dima пишет:
01 Апр 2014 в 23:17
могу посоветовать отличную программу для оптимизации и ускорения работы операционной системы, чистка от мусора, чистка реестра и другие функции - Ashampoo WinOptimizer 11 вот ссылка для скачивания dfiles.ru/files/qpcahmuvo