я всегда предпочитаю работать с подготовленными операторами SQL для повышения производительности? - PullRequest
3 голосов
/ 06 января 2011

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

Есть ли минусы в этом подходе?

Я использую odbc (libodbc ++) из C ++ в mysql.

Ответы [ 4 ]

5 голосов
/ 06 января 2011

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

Зачем использовать готовые заявления?

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

Подготовленные заявления могут помочь увеличить безопасность путем отделения логики SQL от данные предоставляются. это разделение логики и данных может помочь предотвратить очень распространенный тип уязвимость называется инъекцией SQL атака. Обычно, когда вы имеете дело со специальным запросом, вы должны быть очень осторожен при обработке данных что вы получили от пользователя. это влечет за собой использование функций, которые экранируют все необходимые неприятности символы, такие как одинарные кавычки, двойная кавычка и обратная косая черта персонажи. Это не нужно, когда иметь дело с подготовленными заявлениями. разделение данных позволяет MySQL автоматически учитывать эти персонажи и они не должны быть сбежал с помощью любой специальной функции.

Увеличение производительности в подготовленные заявления могут исходить от несколько разных функций. Во-первых нужно только разобрать запрос по одному время. Когда вы изначально готовите заявление, MySQL будет анализировать заявление, чтобы проверить синтаксис и установить вверх запрос, который будет запущен. Тогда если вы выполнить запрос много раз, это будет больше не будет накладных расходов. это предварительный анализ может привести к скорости увеличить, если вам нужно запустить то же самое много раз, например, когда много операторов INSERT.

(Примечание: пока этого не произойдет с MySQL 4.1, будущие версии также кэшировать план выполнения подготовленных заявления, устраняя еще один бит накладные расходы вы платите за каждый выполнение запроса.)

Второе место, где производительность может увеличение за счет использования нового двоичный протокол, который подготовил заявления могут использовать. Традиционный протокол в MySQL всегда конвертирует все в строки перед отправкой их по сети. Это означает что клиент преобразует данные в строки, которые часто больше, чем исходные данные, отправляет их через сеть (или другой транспорт) к сервер, который, наконец, декодирует строка в правильный тип данных. двоичный протокол удаляет это конверсионные накладные расходы. Все типы отправлено в собственном двоичном виде, который сохраняет использование процессора преобразования и также может сократить использование сети.

Когда следует использовать подготовленные заявления? Подготовленные заявления могут быть полезным для всего вышеперечисленного причины, однако они не должны (и не могут быть использованы для всего в ваше приложение. Во-первых, тип запросов, над которыми они работают ограничено DML (INSERT, REPLACE, ОБНОВЛЕНИЕ и УДАЛЕНИЕ), СОЗДАТЬ ТАБЛИЦУ, и ВЫБЕРИТЕ запросы. Поддержка дополнительных типы запросов будут добавлены в дальнейшем версии, чтобы подготовить API заявления более общий.

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

4 голосов
/ 06 января 2011
2 голосов
/ 06 января 2011

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

Если у вас есть запрос, который выполняется не часто, хотя (менее одного раза для запроса), подготовленный операторможет занять больше времени, чтобы бежать.Для использования подготовленного оператора требуется два вызова: один для его подготовки и один для его выполнения.С помощью специального заявления эти два шага выполняются одним махом, и сервер не ждет, чтобы сказать «хорошо, готово компиляция».

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

2 голосов
/ 06 января 2011

Большее количество активных подготовленных операторов потребляет дополнительную память сервера.Например, это может быть проблемой для встроенных платформ (например, базы данных sqlite на IPhone).

...