Цитирую часть ответа, полученного мной на еще один мой вопрос:
In the PHP/MySQL world I would say stored procedures are no-go
Я хотел бы знать: так ли это? Почему? Почему нет?
[edit] Я имею в виду это как общий вопрос без особой необходимости [/ edit]






Есть ли у вас особые потребности, которые заставляют вас задуматься о них? Хранимые процедуры гораздо менее переносимы, чем "простой" SQL, поэтому обычно люди не хотят их использовать. Кроме того, написав значительную часть PL / SQL, я должен сказать, что процедурный способ написания кода добавляет сложности, и он просто не очень современный и не тестируемый. Они могут быть полезны в некоторых особых случаях, когда вам нужно оптимизировать, но я, конечно, дважды подумаю. У Джеффа похожие мнения.
Возможно, существует боязнь хранимых процедур с mysql, отчасти из-за того, что они не являются чрезвычайно мощными (по сравнению с Postgresql и даже MSSQL, хранимые процедуры mysqls сильно отсутствуют).
О плюсах: они упрощают взаимодействие с более чем одним языком.
Если кто-то заявляет, что «использование хранимых процедур плохо, потому что они не переносятся в разные базы данных», то это, конечно, означает, что они думают, что вы, вероятно, смените базы данных, а это, в свою очередь, говорит, что они думают, что вам не следует использовать mysql.
В наши дни популярно использовать ORM, но я лично считаю, что ORM - это плохо (Вопрос: 82882)
Это субъективный вопрос.
Я бы лично включил все вычисления в PHP и действительно использовал MySQL только как таблицу.
Но, если вы чувствуете, что использовать хранимые процедуры проще, тогда непременно сделайте это.
Я бы не сказал, что «хранимые процедуры не подходят», я бы сказал: «Не используйте их без уважительной причины».
Хранимые процедуры MySQL имеют особенно ужасный синтаксис (Oracle и MSSQL тоже довольно ужасны), их обслуживание только усложняет ваше приложение.
Используйте хранимую процедуру, если у вас есть реальная (измеримая) причина для этого, в противном случае - нет. Во всяком случае, это мое мнение.
При использовании хранимых процедур с MySQL вам часто потребуется использовать интерфейс mysqli в PHP, а не обычный интерфейс mysql.
Причина этого заключается в том, что хранимые процедуры часто возвращают более одного набора результатов. Если это так, mysql API не сможет с этим справиться, и вы получите ошибки.
Интерфейс mysqli имеет функции для обработки этих множественных наборов результатов, такие как mysqli_more_results и mysqli_next_result.
Имейте в виду, что если вы вообще возвращаете какой-либо набор результатов из хранимой процедуры, вам необходимо использовать эти API, поскольку хранимая процедура генерирует 1 набор результатов для фактического выполнения, а затем 1 дополнительный для каждого набора результатов, намеренно возвращенного из хранимая процедура.
Я разрабатываю и поддерживаю большое приложение PHP / MySQL. Вот мой опыт работы с хранимыми процедурами.
Со временем наше приложение стало очень сложным. И со всей логикой на стороне php некоторые операции будут запрашивать базу данных с более чем 100 короткими запросами.
MySQL работает настолько быстро, что производительность остается приемлемой, но невысокой.
В нашей последней версии программного обеспечения мы приняли решение перенести часть логики в хранимые процедуры для сложных операций.
Мы действительно добились значительного прироста производительности благодаря тому, что нам не нужно было пересылать данные между PHP и MySQL.
Я согласен с другими авторами в том, что PL / SQL не является современным языком и его трудно отлаживать.
Итог: хранимые процедуры - отличный инструмент для определенных ситуаций. Но я бы не рекомендовал их использовать, если у вас нет веской причины. Для простых приложений хранимые процедуры не стоят хлопот.
Я думаю, что использование хранимых процедур может предложить некоторую абстракцию в определенных приложениях, так как везде, где вы использовали бы один и тот же фрагмент кода SQL для обновления или добавления тех же данных, вы могли бы затем создать один sproc save_user ($ attr ..... ), а не повторяться повсюду.
Согласны, синтаксис волосатый, и если вы привыкли к MSSQL и oracle sprocs, есть различия, которые могут провалиться.
Вы также должны знать, что хранимые процедуры не поддерживались в Mysql до версии 5.0. http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html Также хранимые процедуры имели тенденцию быть немного странными в этой реализации. Теперь, когда Mysql 5.1 начинает появляться в дикой природе, я вижу, что с Mysql все чаще используются хранимые процедуры.
Так что да, идите в ногу со временем. Нет ничего более волнующего, чем «мы используем PHP 4 и MySQL 3».
Я ограниченно использую хранимые процедуры, и это хорошо работает. Я ведущий разработчик для одной из клиентов моей компании, работаю над их веб-сайтом электронной связи. У клиента есть стандартная система, мы внедрили в его систему набор хранимых процедур и создали API для взаимодействия с ней. Это позволило нам абстрагироваться от их базы данных, и они могли реализовать логику в хранимых процедурах. Просто, но очень хорошо отвечает бизнес-требованиям.
Я обычно избегаю хранимых процедур, потому что они увеличивают нагрузку на базу данных, которая в 99% случаев является вашим самым большим узким местом. Добавление нового php-сервера - ничто по сравнению с репликацией базы данных MySQL.
Я думал, что SP позволяют движку базы данных оптимизировать выполнение запроса способом, который невозможен с помощью специальных запросов? Таким образом, уменьшая нагрузку на БД, а не увеличивая ее?
Погодите, это не совсем так. просто потому, что на сервере MySQL работает больше логика и CONCATS, не означает, что вы обязательно делаете больше данные хиты. Проблемы с производительностью базы данных не всегда основаны на потреблении ЦП, но я считаю, что они связаны с блокировкой таблиц, сбросом данных и тому подобным. Я действительно не знаю, но, как сказал @Anders, SP может несколько смягчить эту проблему, а не усугубить ее.
Было бы полезно, если бы вы предоставили ссылку на вопрос для контекста.