28.11. Повышение скорости обработки запросов СУБД MySQL
Функция mysql_query, вероятно, самая популярная в PHP. Являясь пользователем MySQL, вы постоянно используете ее для отправки запросов к серверу MySQL, получая в ответ результирующие наборы. Но, возможно, вы не знаете, что при возвращении больших результирующих наборов или при запросах к большим базам данных функция mysql_query может работать очень неэффективно.
Для того чтобы разобраться в причинах этой неэффективности, необходимо понимать, как работает функция mysql_query. При выдаче запроса SELECT с помощью функции mysql_query PHP отправляет его на сервер MySQL, который анализирует его, создает план выполнения и начинает итерации по строкам таблицы в поиске соответствующих результатов. При каждом нахождении соответствующего результата сервер отсылает его назад по сети клиенту. На стороне клиента PHP присоединяет каждую строку в буфер до тех пор, пока сервер не отправит сообщение с подтверждением того, что больше строк не осталось. Когда это происходит, функция mysql_query возвращает управление приложению PHP и разрешает осуществить итерации по результату, расположенному в буфере.
Проблема производительности возникает тогда, когда мы сталкиваемся с большими результирующими наборами или когда осуществляется запрос к очень большим базам данных. В таких случаях время, прошедшее с момента получения первой результирующей и последней результирующей строки, может быть достаточно продолжительным. Даже если клиент ничего не делает, в этот момент начать обработку результатов невозможно. Необходимо выждать до тех пор, пока сервер не отправит самую последнюю строку, и только после этого управление будет возвращено пользователю, и он сможет приступить к обработке результатов. А хотелось бы приступать к обработке результирующих строк по мере их поступления, так как это позволило бы увеличить быстродействие. И, как всегда, PHP не разочарует вас.
Кроме функции mysql_query, PHP предлагает дополнительную версию этой функции - mysql_unbuffered_query. API-интерфейс для обеих функций идентичный, но функция mysql_unbuffered_query не буферизирует результирующие строки перед передачей управления PHP-приложению. Вместо этого он возвращает управление PHP сразу же после выдачи запроса. Каждый раз, когда мы выбираем строку, модуль MySQL пытается прочесть следующую строку с сервера и возвращает управление приложению сразу же после выборки строки. Таким образом, появляется возможность обработки строк по мере их появления, не ожидая, когда будет получен весь результирующий набор.
Но если небуферизируемые запросы такие замечательные, то почему PHP разрешает использовать обычные буферизируемые запросы? К сожалению, на то есть своя причина, заключающаяся в том, что небуферизируемые запросы - не всегда лучший выход. Если сервер отправляет строки быстрее, чем клиент может прочесть их, сервер блокирует соответствующие таблицы больше времени, чем это необходимо. Операторы SQL, предназначенные для записи в эту таблицу, ожидают, пока операция чтения не будет завершена. Это может привести к существенному снижению производительности для страниц, которые производят изменения в базе данных. Поэтому использование небу-феризируемых запросов рекомендуется только тогда, когда общее количество клиентов, работающих с данной страницей, мало или обновления происходят нечасто.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
PHP. Эффективность и отладка. Часть Десятая.
14-07-2015
<< Предыдущая статья | Следующая статья >> |
PHP. Эффективность и отладка. Часть Девятая. | PHP. Эффективность и отладка. Часть Одиннадцатая. |