Хранимая процедура MySQL против сложного запроса - PullRequest
18 голосов
/ 20 июля 2009

Как выполняется хранимая процедура? Стоит ли их использовать вместо реализации сложного запроса в вызове PHP / MySQL?

Ответы [ 5 ]

17 голосов
/ 21 июля 2009

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

Посмотрите на индексы и правильный дизайн таблицы, чтобы получить лучшую производительность.

10 голосов
/ 04 октября 2011

Я бы не хотел, чтобы кто-то читал эти ответы и получал неправильное впечатление. Есть некоторые действительно важные различия между реализациями «Хранимые все» в «MySQL» и «SQL-сервер / Oracle».

См .: http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/

Каждый, кто задает этот вопрос, предполагает что-то о MySQL. реализация хранимой процедуры; они неправильно считают, что хранятся процедуры компилируются и хранятся в глобальном кэше хранимых процедур, похож на кэш хранимых процедур в Microsoft SQL Server [1] или Oracle [2].

Это неправильно. Неверное выравнивание.

Вот истина: каждое соединение с сервером MySQL поддерживает собственный кэш хранимых процедур.

Найдите минутку, чтобы прочитать остальную часть статьи и комментарии. Это коротко, и у вас будет намного лучшее понимание проблем.

4 голосов
/ 20 июля 2009

Как было указано мне в предыдущем ответе, любезно предоставленном JohnFX:

"Выигрыш в производительности хранимых процедур в лучшем случае сомнителен и минимален. Некоторые материалы для чтения по этому вопросу:

http://statestreetgang.net/post/2008/04/My-Statement-on-Stored-Procedures.aspx

http://betav.com/blog/billva/2006/05/are_stored_procedures_faster_t.html

Наслаждайтесь.

2 голосов
/ 20 июля 2009

упрощенно - Производительность хранимых процедур равна или незначительно выше, чем у кода, за счет нагрузки на сервер базы данных. Поскольку большинство систем БД связаны с многопользовательским доступом и используют стандартное аппаратное обеспечение для сервера БД, использование разгрузки кода для сервера БД, вероятно, выиграет в целом. При использовании высокопроизводительных серверов БД,> 4 ядер,> 32 ГБ ОЗУ загрузка SP часто не является проблемой.

хранимые процедуры;

  1. передача меньшего количества данных в запросе - минимальное улучшение скорости для хорошо написанного кода
  2. синтаксический анализ и кэширование "немного лучше" - минимальное улучшение скорости для хорошо написанного кода
  3. перенести загрузку выполнения на сервер БД по сравнению с клиентом (ами) (веб-серверами), потенциально распределяя нагрузку по многим системам. - улучшения скорости очень зависят от фактического кода и объема данных, включая «избыточные» передаваемые данные. Довольно много кода передает больше данных, чем фактически используется (библиотеки БД, плохо написанные запросы, выбор * и т. Д.)

Не оптимизируйте рано.

Хранимые процедуры имеют много других преимуществ, кроме скорости, безопасность в списке - высокая.

В среде с одним программистом преимущества могут быть компенсированы кривой обучения программированию SP, структурой тестирования SP, несколькими методами контроля версий - SP и кодом и т. Д.

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

Ответьте "стоит ли это того" - если у вас нет инфраструктуры тестирования / профилирования, вы будете только догадываться. Любой ответ, основанный на моем коде и оборудовании, вероятно, не имеет отношения к вашему.

Мой реальный опыт работы со многими веб-приложениями на Perl / TCL / PHP / C, использующими хранимые процессы БД (Sybase, Oracle, MS SQL, MySQL, Postgres), НЕ значительно повышает производительность по всем параметрам. Но я все еще использую их часто, просто по другим причинам, кроме производительности. Они могут значительно улучшить конкретный сложный запрос, но это редко - основная часть кода и общее время обработки.

2 голосов
/ 20 июля 2009

В MySQL или любом другом сервере SQL, таком как MSSQL или Oracle, хранимые процедуры значительно увеличивают скорость выполнения запросов, поскольку они уже скомпилированы. Хранимые процедуры более безопасны, чем прямые запросы, и как объект в базе данных они могут управляться владельцем, предоставляя право доступа каждому пользователю.

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

Окончательно хранимые процедуры пород !!!!

Из документации MySQL 5.1: Сохраненные процедуры могут быть особенно полезны в определенных ситуациях:

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

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

Хранимые подпрограммы могут обеспечить улучшенную производительность, поскольку между сервером и клиентом необходимо передавать меньше информации. Компромисс заключается в том, что это увеличивает нагрузку на сервер базы данных, поскольку большая часть работы выполняется на стороне сервера, а меньшая - на стороне клиента (приложения). Учтите это, если многие клиентские машины (например, веб-серверы) обслуживаются только одним или несколькими серверами баз данных.

Хранимые подпрограммы также позволяют вам иметь библиотеки функций на сервере базы данных. Это функция, используемая в современных языках приложений, которая позволяет такое проектирование внутренне (например, с помощью классов). Использование этих возможностей языка клиентских приложений полезно для программиста даже за пределами использования базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...