Хобрук: Ваш путь к мастерству в программировании

Подготовленное заявление подготовлено только один раз?

Подключение к базе данных:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass,
               array(PDO::ATTR_PERSISTENT => true));

Подготовка заявления:

$stmt = $db->prepare('SELECT * FROM foo',
                     array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));

Является ли оператор SELECT * FROM foo подготовленным только один раз, а затем сохраненным на сервере MySQL для всех последующих вызовов скрипта PHP? Или он переподготавливается каждый раз, когда вызывается PHP-скрипт?


Ответы:


1

К сожалению, ответ не имеет значения.

Даже если подготовленный оператор останется подготовленным на протяжении всего времени существования постоянного соединения, PHP не сможет сослаться на него после завершения текущего скрипта. Учитывая, что дескриптор оператора в любом случае в конечном итоге выйдет за пределы области видимости, скорее всего, даже если оператор может сохраниться, это, скорее всего, не произойдет. Это предположение, но вполне вероятно, что здесь PDO убирает за собой.

Настоящая проблема заключается в том, что PDO по умолчанию эмулирует подготовленные операторы. То есть он выполняет локальное экранирование и замену заполнителей. Это означает, что сервер никогда не видит, как реально готовится, связывается и выполняется. Если вы хотите использовать настоящую подготовку, отключите эмуляцию.

28.12.2012
  • Думаю, мне лучше подготовить оператор вне PDO, используя MySQL. 28.12.2012
  • Хотя это возможно, имейте в виду, что pconnect работает для каждого процесса. Если вы используете Apache или FastCGI, каждый рабочий процесс получает собственное независимое (постоянное) соединение. Выписка, подготовленная в соединении одного работника, не будет присутствовать в соединениях других. Пожалуйста, убедитесь, что вы не занимаетесь микрооптимизацией здесь. MySQL не является продвинутой базой данных с хорошим планировщиком запросов, и не так сильно выигрывает от повторного использования подготовленных операторов, как это было раньше в других базах данных. 28.12.2012
  • Вы пишете: PDO по умолчанию эмулирует подготовленные операторы.. Кажется, это не так (уже?). Согласно руководству по PDO: PDO_MYSQL использует преимущества встроенная поддержка подготовленных операторов присутствует в MySQL 4.1 и выше. Если вы используете более раннюю версию клиентских библиотек mysql, PDO эмулирует их для вас. 28.12.2012
  • @feklee, это тонкая ложь в документации. См. ошибка PHP № 61969 (исправьте документацию) и bug #54638 (исправить реализацию), а также сопутствующее обсуждение php-internals. 28.12.2012

  • 2

    Хотя вы можете обмануть PHP, чтобы он сохранял подготовленные операторы между запросами в рамках одного постоянного соединения (используя «текстовые» подготовленные операторы вместо «двоичных» и пару других хаков), это потребует слишком много усилий, но доход будет едва заметным.

    Во всяком случае, для производительности это совершенно не имеет значения. Если вы реально нуждаетесь в ускорении своих запросов, рассмотрите возможность использования HandlerSocket, который может значительно увеличить скорость некоторых запросов.

    28.12.2012
    Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..