Mysql prepared statements

Подготовленные запросы имеются в MySQL начиная с 4.1 и нужны по трём причинам.

  1. Скорость. Если вы выполняете однообразные запросы, то mysql парсеру каждый раз приходится выполнять распознавание - какой тип запроса, какие данные передаются и тому подобное. Если сделать прототип запроса, а в последствии передавать только данные, то ясное дело что это скажется на скорости.
  2. Передача данных. Мало того что для подобных запросов передача бинарных данных не нуждается в конвертировании в строку, так и то что стандартное ограничение на один запрос имеет около 1 мб можно подвинуть благодаря тому что каждый кусок данных передаётся отдельным запросом, а не одним общим (INSERT скажем).
  3. Безопасность. Благодаря отделению данных от запроса вы можете обезопасить себя от SQL injection .

PREPARE some_statement_1 FROM "INSERT INTO my_table (`some_HTML`, `some_title`) VALUES ('?','?')";
SET @someparam_1 = "HTML SOURCE";
SET @someparam_2 = "TITLE HERE";
EXECUTE some_stament_1 USING @someparam_1,@someparam_2;
DEALLOCATE PREPARE some_statement_1;

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

Использование подобной техники через PHP на низком уровне занимается PDO extension и mysqli правда порой не совсем удобным способом, ну а если хочется по-старинке эти запросы генерировать самому, то можно попробовать огромную PEAR:DB или DbSimple

RSS

Комментарии

  • Алексей
    avatar
    подготовленные запросы сохраняются в структуре БД?
    т.е. где-то хранится
    PREPARE some_statement_1 FROM "INSERT INTO my_table (`some_HTML`, `some_title`) VALUES ('?','?')";
    а из приложения мы должны вызвать:
    SET @someparam_1 = "HTML SOURCE";
    SET @someparam_2 = "TITLE HERE";
    EXECUTE some_stament_1 USING @someparam_1,@someparam_2;
    DEALLOCATE PREPARE some_statement_1;
    так?
  • Да, насколько я понял подготовленные запросы хранятся в СУБД до окончания сессии. Происходит ли автоматическая очистка без DEALLOCATE я не знаю.
  • Сергей
    avatar
    в DbSimple нет подготовленных запросов. Там только плэйсхолдеры (?,?d), благодаря которым можно забыть о sql-инъекциях. И вообще DbSimple использует не улучшенную mysqli, а старую mysql