Les procédures stockées MySQL les utilisent ou non pour les utiliser

Nous sommes au début d'un nouveau projet, et nous nous demandons vraiment si nous devrions utiliser des procédures stockées dans MySQL ou non.

Nous utiliserions les procédures stockées uniquement pour insérer et mettre à jour les entités du modèle d'affaires. Il y a plusieurs tables qui représentent une entité de modèle, et nous l'abstraire dans ces procédures stockées insert / update.

D'autre part, nous pouvons appeler insert et update à partir de la couche modèle mais pas dans MySQL mais en PHP.

Dans votre expérience, Quelle est la meilleure option? avantages et inconvénients des deux approches. Quel est le plus rapide en termes de haute performance?

PS: c'est un projet web avec la plupart du temps lu et la haute performance est la condition la plus importante.

52
demandé sur Emilio Nicolás 2011-06-16 12:20:46

12 réponses

Contrairement au code de langage de programmation réel, ils:

  • Pas portable (chaque base de données a sa propre version de PL / SQL. Parfois, différentes versions de la base de données same sont incompatibles-Je l'ai vu!)
  • Pas facilement testable-vous avez besoin d'une instance de base de données real (dev) pour les tester et donc tester leur code dans le cadre d'une construction est pratiquement impossible
  • pas facilement modifiables/détachable - vous devez supprimer/créer, c'est à dire modifier la base de données de production pour les libérer
  • n'ont pas de support de bibliothèque (pourquoi écrire du code quand quelqu'un d'autre a)
  • ne sont pas facilement intégrable avec d'autres technologies (essayez d'appeler un service web à partir d'eux)
  • ils utilisent un langage aussi primitif que Fortran et sont donc inélégants et laborieux pour obtenir un codage utile, il est donc difficile d'exprimer la logique métier, même si c'est généralement ce que leur but principal est
  • Ne pas offrir le débogage / traçage / message-logging etc (certains dbs peut soutenez ceci-Je ne l'ai pas vu cependant)
  • manque d'IDE décent pour aider à la syntaxe et à la liaison avec d'autres procédures existantes (par exemple, comme Eclipse le fait pour java)
  • les personnes qualifiées pour les coder sont plus rares et plus chères que les codeurs d'applications
  • leur" haute performance " est un mythe, car ils s'exécutent sur le serveur de base de données, ils augmentent généralement la charge du serveur db, donc leur utilisation réduira généralement votre débit de transaction maximal
  • incapacité de partager efficacement les constantes (normalement résolues en créant une table et en la questionnant à partir de votre procédure-très inefficace)
  • etc.

Si vous avez une action très spécifique à la base de données (par exemple une action en transaction pour maintenir l'intégrité de la base de données), ou si vous gardez vos procédures très atomiques et simples, vous pourriez peut-être les considérer.

La prudence est recommandée lorsque vous spécifiez "haute performance" à l'avant. Cela conduit souvent à de mauvais choix au détriment d'une bonne conception et cela vous mordra beaucoup plus tôt que vous le pensez.

Utilisez les procédures stockées à vos risques et périls (de quelqu'un qui a été là et ne veut jamais y retourner). Ma recommandation est de les éviter comme la peste.

54
répondu Bohemian 2013-08-20 20:38:07

Contrairement au code de programmation, ils:

  • rend les attaques par injection SQL presque impossible (sauf si vous êtes
    construire et exécuter dynamic
    SQL à partir de vos procédures)
  • nécessitent beaucoup moins de données à envoyer le CIB dans le cadre de la légende
  • permet à la base de données de bien mieux plans de cache et jeux de résultats (c'est certes pas si efficace avec MySQL en raison de sa mise en cache interne les structures)
  • sont facilement testables isolément (c'est à dire pas dans le cadre des tests JUnit)
  • sont portables en ce sens qu'ils vous permettre d'utiliser db spécifiques caractéristiques, abstraites derrière un nom de la procédure (dans le code, vous êtes bloqué avec des éléments génériques de type SQL)
  • ne sont presque jamais plus lents que SQL appelé à partir du code

Mais, comme le dit Bohemian, il y a aussi beaucoup d'inconvénients (c'est juste pour offrir une autre perspective). Vous devrez peut-être benchmark avant de décider ce qui est le mieux pour vous.

23
répondu davek 2015-01-28 15:13:38

Quant aux performances, elles ont le potentiel d'être vraiment performantes dans une future version MySQL (sous SQL Server ou Oracle, elles sont un vrai régal!). Pourtant, pour tout le reste... Ils ont totalement exploser la concurrence. Je vais résumer:

  • Sécurité: Vous pouvez donner à votre application le droit D'exécution seulement, tout va bien. Votre SP insérera update select ... sans aucune possibilité de fuite de toute sorte. Cela signifie un contrôle global sur votre modèle et des données appliquées sécurité.

  • Sécurité 2: je sais que c'est rare, mais parfois le code php fuit du serveur (c'est-à-dire devient visible au public). Si cela inclut vos requêtes, les attaquants possibles connaissent votre modèle. C'est assez étrange mais je voulais le signaler quand même

  • Task force: oui, la création de SPs SQL efficaces nécessite des ressources spécifiques, parfois plus coûteuses. Mais si vous pensez que vous n'avez pas besoin de ces ressources simplement parce que vous intégrez vos requêtes dans votre client... vous allez avoir de sérieux problèmes. Je mentionnerais l'analogie du développement web: il est bon de séparer la vue du reste car votre concepteur peut travailler sur sa propre technologie tandis que les programmeurs peuvent se concentrer sur la programmation de la couche métier.

  • Encapsulation de la couche métier: l'utilisation de procédures stockées isole totalement l'entreprise à laquelle elle appartient: la fichue base de données.

  • Rapidement testable: une ligne de commande sous votre shell et votre code est testé.

  • Indépendance de la technologie client: si demain vous souhaitez passer de php à autre chose, pas de problème. Ok, juste stocker ces SQL dans un fichier séparé ferait l'affaire aussi, c'est vrai. En outre, bon point dans les commentaires sur si vous décidez de changer de moteur sql, vous auriez beaucoup de travail à faire. Vous devez avoir une bonne raison de le faire de toute façon, car pour les grands projets et les grandes entreprises, cela arrive rarement (en raison de la gestion des coûts et des ressources humaines la plupart du temps)

  • Application des développements agile 3+: si votre base de données n'est pas sur le même serveur que votre code client, vous pouvez avoir des serveurs différents, mais un seul pour la base de données. Dans ce cas, vous n'avez pas besoin de mettre à niveau vos serveurs php lorsque vous devez changer le code lié à SQL.

Ok, je pense que c'est la chose la plus importante que j'avais à dire sur le sujet. J'ai développé dans les deux esprits (SP vs client) et j'aime vraiment, vraiment le style SP. Je viens de j'aurais aimé que Mysql ait un véritable IDE pour eux parce que maintenant c'est un peuune douleur dans le cul limitée.

12
répondu Sebas 2017-02-09 17:03:17

Les procédures stockées sont bonnes à utiliser car elles gardent vos requêtes organisées et vous permettent d'effectuer un lot à la fois. Les procédures stockées sont normalement rapides en exécution car elles sont pré-compilées, contrairement aux requêtes qui sont compilées à chaque exécution. Cela a un impact significatif dans les situations où la base de données est sur un serveur distant; si les requêtes sont dans un script PHP, il y a plusieurs communications entre l'application et le serveur de base de données - la requête est envoyée, exécutée et le résultat est lancé arrière. Cependant, si vous utilisez des procédures stockées, il suffit d'envoyer une petite instruction D'appel au lieu de grandes requêtes compliquées.

Il peut prendre un certain temps pour s'adapter à la programmation d'une procédure stockée car ils ont leur propre langage et syntaxes. Mais une fois que vous êtes habitué, vous verrez que votre code est vraiment très propre.

En termes de performance, il peut ne pas y avoir de gain significatif si vous utilisez ou non des procédures stockées.

7
répondu Abhay 2011-06-16 08:38:02

Je ferai connaître mon opinion, malgré mes toughts ne sont peut-être pas directement liés à la question.:

Comme dans de nombreux problèmes, répondre à l'utilisation de procédures stockées ou d'une solution pilotée par une couche d'application repose sur des questions qui stimuleront l'effort global:

  • Ce que vous voulez obtenir.

Essayez-vous de faire des opérations par lots ou des opérations en ligne? sont-ils complètement transactionnels? dans quelle mesure ces opérations sont-elles récurrentes? Quelle est la charge de travail attendue pour la base de données?

  • Ce que vous avez pour l'obtenir.

Quel type de technologie de base de données Avez-vous? Quel genre d'infrastucture? Votre équipe est-elle entièrement formée à la technologie des bases de données? Votre équipe est-elle mieux capable de construire une solution de base de données-aegnostic?

  • Il est temps de l'obtenir.

Pas de secrets à ce sujet.

  • Architecture.

Votre solution doit-elle être distribuée sur plusieurs emplacements? est votre solution pour utiliser les communications à distance? votre solution fonctionne-t-elle sur plusieurs serveurs de base de données ou utilise-t-elle une architecture basée sur un cluster?

  • Mainteinance.

Combien la demande est-elle nécessaire pour changer? avez-vous personnel spécifiquement formé pour maintenir la solution?

  • Gestion Du Changement.

Voyez-vous que votre technologie de base de données va changer à court, moyen, long terme? voyez vous sera nécessaire pour migrer la solution fréquemment?

  • Coût

Combien coûtera la mise en œuvre de cette solution en utilisant l'une ou l'autre stratégie?

L'ensemble de ces points conduira la réponse. Donc, vous devez prendre soin de chacun de ces points lors de la prise d'une décision sur l'utilisation ou non une stratégie. Il y a des cas où l'utilisation de procédures stockées est meilleure que les requêtes gérées par la couche application, et d'autres où la conduite de requêtes et l'utilisation d'une solution basée sur la couche application sont les meilleures.

Utilisation de les procédures stockées ont tendance à être plus adequate lorsque:

  1. Votre technologie de base de données n'est pas fournie pour changer rapidement.
  2. Votre technologie de base de données peut gérer des opérations parallélisées, des partitions de table ou toute autre stratégie pour diviser la charge de travail sur plusieurs processeurs, mémoire et ressources (clustering, grille).
  3. Votre technologie de base de données est entièrement intégrée au langage de définition proceduce stocké, c'est-à-dire que le support est à l'intérieur de la base de données moteur.
  4. Vous avez une équipe de développement qui n'a pas peur d'utiliser un langage procédural (3ème. Langue de génération) pour obtenir un résultat.
  5. les opérations que vous souhaitez réaliser sont intégrées ou prises en charge dans la base de données (Exportation vers des données XML, gestion appropriée de l'intégrité et de la cohérence des données avec des déclencheurs, des opérations planifiées, etc.).
  6. La Portabilité n'est pas un problème important et vous ne faites pas un changement technologique à court terme dans votre organisation, même, ce n'est pas le cas souhaitable. Généralement, la portabilité est considérée comme une étape importante par les développeurs axés sur les applications et les couches. De mon point de vue, la portabilité n'est pas un problème lorsque votre application ne doit pas être déployée sur plusieurs plates-formes, moins lorsqu'il n'y a aucune raison de faire un changement technologique ou que l'effort de migration de toutes les données organisationnelles est supérieur à l'avantage de faire un changement. Ce que vous pouvez gagner en utilisant une approche axée sur la couche d'application (portabilité), vous pouvez lâche dans la performance et la valeur obtenue à partir de votre base de données (Pourquoi dépenser des milliers de dollars pour obtenir une Ferrari que vous conduirez pas plus de 60 milles/h?).
  7. la Performance est un problème. Premièrement: dans plusieurs cas, vous pouvez obtenir de meilleurs résultats en utilisant un seul appel de procédure stocké que plusieurs demandes de données provenant d'une autre application. De plus, certaines caractéristiques que vous devez effectuer peuvent être intégrées dans votre base de données et son utilisation moins coûteuse en termes de charge de travail. Lorsque vous utilisez un solution pilotée par la couche d'application vous devez prendre en compte le coût associé pour établir des connexions de base de données, effectuer des appels à la base de données, le trafic réseau, l'encapsulation des données (c'est-à-dire, en utilisant Java ou.NET, il y a un coût implicite lors de l'utilisation des appels JDBC/ADO.NET car vous devez envelopper vos données dans des objets qui représentent les données de la base de données, donc l'instanciation a un coût associé en termes de traitement, de mémoire et de réseau lorsque les données proviennent et vont à l'extérieur).

Utilisation de les solutions pilotées par la couche d'application ont tendance à être plus adequate lorsque:

  1. la Portabilité est une question importante.
  2. L'Application sera déployée sur plusieurs emplacements avec seulement un ou quelques dépôts de base de données.
  3. Votre application utilisera des règles orientées métier lourdes, qui doivent être indépendantes de la technologie de base de données sous-jacente.
  4. Vous avez à l'esprit de faire changer les fournisseurs de technologie en fonction des tendances du marché et du budget.
  5. votre base de données n'est pas entièrement intégré avec le langage de procédure stocké qui appelle à la base de données.
  6. vos capacités de base de données sont limitées et vos besoins vont au-delà de ce que vous pouvez réaliser avec votre technologie de base de données.
  7. Votre application peut supporter la pénalité inhérente aux appels externes, est plus transactionnelle avec des règles spécifiques à l'entreprise et doit abstraire le modèle de base de données sur un modèle d'affaires pour les utilisateurs.
  8. la parallélisation des opérations de base de données n'est pas importante, la base de données n'a pas de capacités de parallélisation.
  9. Vous avez une équipe de développement qui n'est pas bien formée sur la technologie de base de données et qui est mieux productive en utilisant une technologie basée sur les applications.

J'espère que cela peut aider quiconque se demande ce qu'il vaut mieux utiliser.

5
répondu Enyix Mexico 2012-02-19 08:20:49

Je vous recommande de ne pas utiliser les procédures stockées:

  • leur langue dans MySQL est très merdique
  • Il n'y a aucun moyen d'envoyer des tableaux, des listes, ou d'autres types de structure de données dans une procédure stockée
  • une procédure stockée ne peut jamaischanger son interface; MySQL n'autorise ni paramètres nommés ni paramètres optionnels
  • cela rend le déploiement de nouvelles versions de votre application plus compliqué-disons que vous avez 10x serveurs d'applications et 2 bases de données, qui avez-vous mise à jour en premier?
  • vos développeurs ont tous besoin d'apprendre et de comprendre le langage de procédure stocké - ce qui est très merdique (comme je l'ai mentionné précédemment)

Au Lieu de cela, je recommande de créer une couche / bibliothèque et de mettre toutes vos requêtes

Vous pouvez

  • Mettez à jour cette bibliothèque et expédiez-la sur vos serveurs d'applications avec votre application
  • avoir des types de données riches, tels que des tableaux, des structures, etc. passés autour de
  • Testez cette bibliothèque au lieu de la bibliothèque stockée procédure.

Sur les performances:

  • L'utilisation de procédures stockées diminuera les performances de vos développeurs d'applications, ce qui est la principale chose qui vous intéresse.
  • il est extrêmement difficile d'identifier les problèmes de performance dans une procédure stockée compliquée (c'est beaucoup plus facile pour les requêtes simples)
  • vous pouvez soumettre un lot de requête en un seul morceau sur le fil (si L'indicateur CLIENT_MULTI_STATEMENTS est activé), ce qui signifie que vous n'en Obtenez plus latence sans procédures stockées.
  • le code côté Application évolue généralement mieux que le code côté base de données
3
répondu MarkR 2011-06-16 13:54:31

Si votre base de données est complexe et non un type de forum avec des réponses, mais true warehousing SP en bénéficiera certainement. Vous pouvez sortir toute votre logique métier là-dedans et pas un seul développeur ne s'en souciera, ils appellent simplement vos SP. j'ai fait cela rejoindre plus de 15 tables n'est pas amusant, et vous ne pouvez pas expliquer cela à un nouveau développeur.

Les développeurs n'ont pas non plus accès à une base de données, génial! Laissez cela aux concepteurs de bases de données et aux mainteneurs. Si vous décidez également que le la structure de la table va changer, vous pouvez le cacher derrière votre interface. n-Tier, vous vous souvenez??

La haute performance et la base de données relationnelle ne sont pas quelque chose qui va ensemble, même avec MySQL InnoDB est lent, MyISAM devrait être jeté par la fenêtre maintenant. Si vous avez besoin de performances avec une application web, vous avez besoin d'un cache approprié, memcache ou autres.

Dans votre cas, parce que vous avez mentionné 'Web', Je n'utiliserais pas de procédures stockées, si c'était un entrepôt de données, je le considérerais certainement (nous utilisons des SP pour notre entrepôt).

Astuce: Depuis que vous avez mentionné Web-project, jamais à propos de nosql sorte de solution? En outre, vous avez besoin d'une base de données rapide, pourquoi ne pas utiliser PostgreSQL? (en essayant de défendre ici...)

2
répondu R. van Twisk 2011-06-16 21:26:53

J'avais L'habitude D'utiliser MySql et ma compréhension de sql était au mieux médiocre, j'ai passé beaucoup de temps à utiliser Sql Server, j'ai une séparation claire d'une couche de données et d'une couche d'application, je m'occupe actuellement d'un serveur de 0,5 téraoctet.

Je me suis senti frustré parfois de ne pas utiliser un ORM car le développement est vraiment rapide avec des procédures stockées, il est beaucoup plus lent. Je pense qu'une grande partie de notre travail aurait pu être accélérée en utilisant un ORM.

Lorsque votre application atteint la masse critique, la performance ORM souffrira, une procédure stockée bien écrite, vous donnera vos résultats plus rapidement.

À titre d'exemple de performance, je collecte 10 types de données différents dans une application, puis je les convertit en XML, que je traite dans la procédure stockée, j'ai un appel à la base de données plutôt que 10.

Sql est vraiment bon pour traiter les ensembles de données, une chose qui me frustreai quand je vois quelqu'un obtenir des données de sql sous une forme brute et utiliser du code d'application pour boucler sur les résultats et le format et les regrouper, c'est vraiment une mauvaise pratique.

Mon conseil est d'apprendre et de comprendre assez sql et vos applications en bénéficieront vraiment.

2
répondu Charles Bryant 2015-06-25 09:27:56

Je vous recommande de rester à l'écart des procédures stockées spécifiques à la base de données.

J'ai traversé beaucoup de projets où ils veulent soudainement changer de plate-forme DB et le code à l'intérieur D'un SP n'est généralement pas très portable = travail supplémentaire et erreurs possibles.

Le développement de procédures stockées nécessite également que le développeur ait accès directement au moteur SQL, où une connexion normale peut être modifiée par n'importe qui dans le projet avec accès au Code uniquement.

Concernant votre Modèle / couche / idée de niveau: Oui, restez avec ça.

  • appels de site Web Business layer (BL)
  • BL appelle la couche de données (DL)
  • DL appelle n'importe quel Stockage (SQL, XML, Webservice, Sockets, Textfiles etc.)

De Cette façon, vous pouvez maintenir le niveau logique entre les niveaux. SI ET SEULEMENT si les appels DL semblent être très lents, vous pouvez commencer à jouer avec les procédures stockées, mais maintenir le code none-SP original quelque part, si vous avez soudainement besoin de transférer la base de données vers un toute nouvelle plate-forme. Avec tout l'hébergement Cloud dans l'entreprise, vous ne savez jamais ce qui va être la prochaine plate-forme DB...

Je garde un œil sur Amazon AWS de la même raison.

1
répondu BerggreenDK 2011-06-16 08:49:48

Beaucoup d'informations ici pour confondre les gens, le développement logiciel est une évolution. Ce que nous avons fait il y a 20 ans n'est pas la meilleure pratique maintenant. De retour dans la journée avec le serveur client classique, vous ne rêveriez de rien d'autre que SPs.

Ce sont absolument des chevaux pour les cours, Si vous êtes une grande organisation avec vous utiliserez plusieurs niveaux, et probablement SPs mais vous vous en soucierez peu car une équipe dédiée les trie.

Le contraire qui est où je me retrouve à essayer de rapidement knock up une solution d'application web, qui affine les exigences métier, il était super rapide de laisser le développeur (à distance pour moi) pour knock up les pages et les requêtes SQL et je définis la structure DB.

Cependant, la complexité augmente et sans un moyen facile de fournir des API, je cherche à utiliser SPs pour contenir la logique métier. Je pense que cela fonctionne bien et sensé, je contrôle cela parce que je peux construire une logique et fournir un jeu de résultats simple pour mon développeur offshore pour construire un front fin autour.

Si je trouve mon logiciel un succès phénoménal, alors plus de séparation des préoccupations se produira et différentes implémentations de n teir se produiront mais pour l'instant les SPs sont parfaits.

Vous devez connaître tous les ensembles d'outils à votre disposition et les faire correspondre est sage de commencer. Sauf si vous construisez un système d'entreprise pour commencer, alors rapide et simple est le meilleur.

1
répondu Richard 2017-10-07 09:25:34

Je pense qu'il y a beaucoup de désinformation sur les requêtes stockées dans la base de données.

Je vous recommande d'utiliser les procédures stockées MySQL si vous effectuez de nombreuses requêtes statiques pour la manipulation des données. Surtout si vous déplacez des choses d'une table à l'autre (c'est-à-dire passer d'une table en direct à une table historique pour une raison quelconque). Il y a des inconvénients bien sûr en ce que vous devrez conserver un journal séparé des modifications (vous pourriez en théorie faire une table qui tient juste changements aux procédures stockées que la mise à jour du DBA). Si vous avez de nombreuses applications différentes interfacant avec la base de données, surtout si vous avez un programme de bureau écrit en C# et un programme web en PHP, il pourrait être plus avantageux d'avoir certaines de vos procédures stockées dans la base de données car elles sont indépendantes de la plate-forme.

Ce site a quelques informations intéressantes à ce sujet que vous pouvez trouver utile.

Https://www.sitepoint.com/stored-procedures-mysql-php/

Comme toujours, construisez d'abord un bac à sable et testez.

0
répondu Dave Babler 2018-08-30 14:16:21

Essayez de mettre à jour 100 000 000 enregistrements sur un système en direct à partir d'un framework, et laissez-moi savoir comment cela se passe. Pour les petites applications, SPs ne sont pas un must, mais pour les grands systèmes sérieux, ils sont un véritable atout.

-2
répondu Milos Musicki 2018-08-14 18:17:02