Лучше ли использовать подготовленный оператор Select, когда вы делаете только один выбор? - PullRequest
4 голосов
/ 23 марта 2009

В настоящее время я пишу класс CRUD на PHP с использованием PDO.

Мне нравится безопасность, которую обеспечивают подготовленные операторы, но я слышал, что они также не позволяют базам данных, таким как mysql, использовать queryCache.

Лучше ли использовать подготовленный оператор выбора, когда вы делаете только один выбор за один раз? или просто $ pdo-> quote () будет достаточно для точки зрения безопасности (или будет иметь какие-то другие преимущества, такие как кэширование?).

Все мои обновления, удаления и вставки уже сделаны с использованием подготовленных заявлений. Мне просто любопытно насчет выбора.

Ответы [ 6 ]

13 голосов
/ 23 марта 2009

MySQLPerformanceBlog.com сделал несколько тестов в статье о « Подготовленные заявления ». Петр Зайцев написал:

Я сделал простой тест (используя SysBench) чтобы увидеть производительность простого запрос (выбор одной строки) с помощью стандартное заявление, подготовленное заявление и он подается из кеша запросов. Подготовленные заявления дают 2290 запросов / сек, что значительно лучше чем 2000 со стандартом заявления, но это все еще значительно ниже 4470 запросов / сек, когда результаты подается из кеша запросов.

Кажется, это говорит о том, что «использование» подготовленных операторов связано с тем, что они на 14,5% быстрее , чем при использовании прямого запроса, по крайней мере в этом простом тесте. Относительная разница, вероятно, уменьшается при более сложном запросе или большем наборе результатов.

Кажется нелогичным, что подготовленные запросы будут выполняться быстрее, учитывая двойное обращение к серверу и другие факторы. Тест Петра не хватает деталей. В любом случае вам следует запускать собственные тесты, поскольку тип выполняемого запроса, а также среда и оборудование, безусловно, являются важными факторами.

Что касается Query Cache, в прошлом было верно, что подготовленные операторы были несовместимы с результатами кэширования запросов, но это было изменено. См. " Как работает кэш запросов " в документации по MySQL:

До MySQL 5.1.17, подготовлено операторы не используют кеш запросов. Начиная с 5.1.17, подготовлено операторы используют кеш запросов под определенные условия, которые отличаются в зависимости от способа приготовления: ...

В документации описываются эти условия. Иди прочитай.

Я рекомендую использовать подготовленные операторы для SELECT запросов. Заключение в кавычки переменных при их интерполяции в операторы SQL может быть эффективным, если вы делаете это последовательно. Но даже цитирование может иметь некоторые незначительные уязвимости безопасности, например с многобайтовыми наборами символов (см. MySQL bug # 8378 ). В этих случаях проще использовать подготовленные запросы безопасным способом.

2 голосов
/ 23 марта 2009

Да, используйте подготовленные заявления. Я серьезно сомневаюсь, что вы столкнетесь с проблемами производительности, поскольку готовые операторы выполняются гораздо медленнее, чем обычный литеральный запрос. Тем не менее, на MySQL, вы, похоже, правы. Тем не менее, я бы выбрал готовые заявления.

Вот одна ссылка: http://www.mysqlperformanceblog.com/2006/08/02/mysql-prepared-statements/

Хотя, если вы беспокоитесь о кэшировании, вы можете посмотреть на такие вещи, как memcached .

1 голос
/ 23 марта 2009

Вы делаете выбор только "один раз" за время существования приложения или "один раз" за вызов функции?

Потому что если последнее, вы все равно должны извлечь выгоду из кэширования в подготовленном утверждении.

1 голос
/ 23 марта 2009

Подготовленные заявления обычно считаются лучшей практикой.

Я бы предложил прочитать статью MySql о подготовленных утверждениях, их практичности и преимуществах по сравнению с обычными интерполированными запросами с простой ванилью.

1 голос
/ 23 марта 2009

Это мое понимание, подтвержденное обсуждением: здесь

Обычный запрос принимается за один строка, проанализированная, выполненная и вернулся. Конец истории. Подготовленный заявление взято в качестве шаблона строка, проанализированная и кэшированная. Тогда переменные были переданы в него, почти как вызов функции.

Кэширование запроса один раз имеет тенденцию немного больше, чем просто выполнение Прямо. Сбережения приходят позже звонки, когда вы пропустите сборник шаг. Вы сохраняете за повторный запрос сумма компиляции.

Итак, вкратце, в MySQL, если вы выполняете запрос один раз, его подготовка просто добавляет ненужное дополнительное количество обработки.

0 голосов
/ 23 марта 2009

Просто напоминание, что MySQL> 5.1.17 использует кэш запросов для подготовленных операторов.

Исходя из кода POV, я считаю, что подготовленные операторы - это, в большинстве случаев, путь с точки зрения читабельности, удобства обслуживания и т. Д ...

Единственная причина не использовать их - это дорогие запросы, которые вызываются с определенной частотой. (запросы, которые занимают много времени и имеют реальную выгоду, будучи в кеше запросов).

...