Как использовать подготовленные заявления для выполнения? Я понимаю, что что-то вроде этого может пригодиться, если я поставлю его в цикле:
SELECT `Name` FROM `Hobbits` WHERE `ID` = :ID;
Я читал, что цикл с подготовленными операторами быстрее, чем цикл без, но в противном случае подготовленные операторы немного снизили бы производительность. Итак, насколько велика эта петля?
Если я запускаю сложный SQL-запрос в начале моего кода и повторяю его с одним другим параметром в конце – будет ли второй запрос работать быстрее? (Мы используем одно соединение для каждой загрузки страницы). Есть ли ограничение на кешированные запросы, поэтому я лучше повторяю свои запросы сразу?
Как насчет выполнения всего скрипта дважды с помощью тех же параметров (перезагрузить страницу или 2 пользователя)?
Готовый запрос предоставляется серверу SQL, который анализирует его и, возможно, уже готовит план выполнения. Затем вам в основном предоставляется идентификатор для этих выделенных ресурсов и можно выполнить этот подготовленный оператор, просто заполнив пробелы в инструкции. Вы можете запускать этот оператор так часто, как вам нравится, и базе данных не придется повторять планирование синтаксического анализа и выполнения, что может привести к повышению скорости.
Пока вы не отбрасываете заявление, нет жесткого тайм-аута того, как долго заявление будет «оставаться готовым». Это не кеш, это выделенный ресурс на SQL-сервере. По крайней мере, пока ваш драйвер базы данных использует собственные подготовленные операторы в SQL API. PDO, например, не делает этого по умолчанию, если вы не установите для PDO::ATTR_EMULATE_PREPARES
значение false
.
Однако в конце выполнения скрипта все эти ресурсы всегда будут освобождены, они не будут сохраняться при разных загрузках страниц. Кроме того, сервер SQL может или не может кэшировать запрос и его результаты в течение некоторого времени независимо от сценария клиента.
Как долго готовятся кешированные запросы mysql?
На самом деле это не «кеш». Подготовленный отчет длится всего лишь во время выполнения скрипта.
Если я запускаю сложный SQL-запрос в начале моего кода и повторяю его с одним другим параметром в конце – будет ли второй запрос работать быстрее?
Чем сложнее запрос, тем меньше эффекта вы увидите. Честно говоря, подготовленный оператор экономит вас только на синтаксический анализ , а если выполнение связано с временным или файрсовым, или приложением, подготовленным для сканирования таблицы, не будет ускорено ни одно из них.
С другой стороны, для простых первичных поисков, которые не связаны с сложным анализом запросов или построением сложных планов запросов, преимущество будет ничтожно малым.
Итак, насколько велика эта петля?
Чем больше итераций он получает, тем больше пользы. Тем не менее, в здравом веб-приложении нужно избегать запросов на цикл.
Как насчет выполнения всего скрипта дважды с помощью тех же параметров (перезагрузить страницу или 2 пользователя)?
Как я сказал выше, никакой выгоды от подготовленного заявления не будет. Однако классический кеш запросов скорее всего будет срабатывать.
Как использовать подготовленные заявления для выполнения?
Ни за что. По крайней мере, не в веб-сервисе PHP. В некотором длинном сценарии на основе cli – может быть.
Однако готовые заявления должны использоваться в любом случае с целью получения синтаксически правильных запросов.
FYI, от
http://dev.mysql.com/doc/refman/5.7/en/statement-caching.html
Системная переменная max_prepared_stmt_count контролирует общее количество операторов, к которым кеширует сервер. (Сумма количества подготовленных заявлений на всех сессиях.)