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