MySQL vs PostgreSQL? Que dois-je choisir pour mon projet Django?

Mon projet Django va être soutenu par une grande firebase database avec plusieurs centaines de milliers d’entrées et devra prendre en charge la recherche (je finirai probablement par utiliser djangosearch ou un projet similaire).

Quel backend de firebase database est le mieux adapté à mon projet et pourquoi? Pouvez-vous recommander de bonnes ressources pour une lecture ultérieure?

En tant que personne ayant récemment basculé un projet de MySQL vers Postgresql, je ne regrette pas le changement.

La principale différence, du sharepoint vue de Django, est une vérification plus rigoureuse des contraintes dans Postgresql, ce qui est une bonne chose, et il est également un peu plus fastidieux de procéder à des modifications manuelles des schémas (ou migrations).

Il existe probablement environ 6 applications de migration de firebase database Django et au moins une ne prend pas en charge Postgresql. Je ne considère pas cela comme un inconvénient parce que vous pouvez utiliser l’un des autres ou le faire manuellement (ce que je préfère atm).

La recherche en texte intégral pourrait être mieux prise en charge pour MySQL. MySQL intègre la recherche en texte intégral dans Django, mais il est inutile (pas de recherche de mots, recherche de phrases, etc.). J’ai utilisé django-sphinx comme une meilleure option pour la recherche de texte intégral dans MySQL.

La recherche en texte intégral est intégrée à Postgresql 8.3 (les versions antérieures ont besoin du module TSearch). Voici un bon article de blog instructif: Recherche de texte intégral dans Django avec PostgreSQL et tsearch2

Pour ce que cela vaut, les créateurs de Django recommandent PostgreSQL.

Si vous n’êtes pas lié à un système existant et que vous avez la liberté de choisir un back-end de firebase database, nous vous recommandons PostgreSQL, qui établit un juste équilibre entre coût, fonctionnalités, rapidité et stabilité. ( Le guide définitif de Django , p. 15)

grande firebase database avec plusieurs centaines de milliers d’entrées,

Ce n’est pas une grande firebase database, c’est très petite.

Je choisirais PostgreSQL, car il a beaucoup plus de fonctionnalités. Plus important encore, dans PostgreSQL ™, vous pouvez utiliser Python comme langage procédural.

Même si Postgresql a l’air meilleur, j’ai quelques problèmes de performances avec Django:

Postgresql est conçu pour gérer les “connexions longues” (regroupement de connexions, connexions persistantes, etc.)

MySQL est conçu pour gérer les “connexions courtes” (connectez-vous, faites vos requêtes, déconnectez-vous, a des problèmes de performances avec beaucoup de connexions ouvertes )

Le problème est que Django ne prend pas en charge le pool de connexion ou la connexion persistante, il doit se connecter / déconnecter à la firebase database à chaque appel de vue.

Cela fonctionnera avec Postgresql, mais la connexion à un Postgresql coûtera BEAUCOUP plus cher que de se connecter à une firebase database MySQL (Sur Postgresql, chaque connexion a son propre processus, c’est beaucoup plus lent que de simplement insérer un nouveau thread dans MySQL).

Ensuite, vous obtenez des fonctionnalités comme le cache de requêtes qui peuvent être très utiles dans certains cas. (Mais vous avez perdu la recherche de texte superbe de PostgreSQL)

Allez avec le plus familier. MySQL vs PostgreSQL est une guerre sans fin. Les deux sont d’excellents moteurs de bases de données et les deux sont utilisés par les principaux sites. Cela n’a pas vraiment d’importance en pratique.

Toutes les réponses apportent des informations intéressantes à la table, mais certaines sont un peu dépassées, alors voici mon grain de sel.

À partir de la version 1.7, les migrations font désormais partie intégrante de Django. Ils ont donc documenté les principales différences que les développeurs Django pourraient vouloir connaître au préalable.

Support backend

Les migrations sont sockets en charge sur tous les systèmes dorsaux fournis par Django, ainsi que sur tous les backends tiers s’ils ont été programmés pour prendre en charge la modification du schéma (effectuée via la classe SchemaEditor ).

Cependant, certaines bases de données sont plus capables que d’autres en matière de migration de schémas; certaines des mises en garde sont traitées ci-dessous.

PostgreSQL

PostgreSQL est le plus capable de toutes les bases de données en termes de prise en charge de schéma; Le seul inconvénient est que l’ajout de colonnes avec des valeurs par défaut entraînera une réécriture complète de la table, pendant une durée proportionnelle à sa taille.

Pour cette raison, il est recommandé de toujours créer de nouvelles colonnes avec null = True, car elles seront ajoutées immédiatement.

MySQL

MySQL ne prend pas en charge les transactions autour des opérations d’altération des schémas, ce qui signifie que si une migration échoue, vous devrez supprimer manuellement les modifications pour réessayer (il est impossible de revenir à un point antérieur).

De plus, MySQL réécrira entièrement les tables pour presque toutes les opérations de schéma et prendra généralement un temps proportionnel au nombre de lignes de la table pour append ou supprimer des colonnes. Sur un matériel plus lent, cela peut être pire qu’une minute par million de lignes – l’ajout de quelques colonnes à une table contenant seulement quelques millions de lignes peut bloquer votre site pendant plus de dix minutes.

Enfin, MySQL a des limites relativement faibles quant à la longueur des noms des colonnes, des tables et des index, ainsi qu’une limite à la taille combinée de toutes les colonnes couvertes par un index. Cela signifie que les index possibles sur d’autres backends ne seront pas créés sous MySQL.

SQLite

SQLite a très peu de prise en charge d’altération de schéma intégrée, et Django tente donc de l’émuler en:

  • Créer une nouvelle table avec le nouveau schéma
  • Copier les données à travers
  • Laisser tomber l’ancienne table
  • Renommer la nouvelle table pour correspondre au nom d’origine

Ce processus fonctionne généralement bien, mais il peut être lent et parfois bogué. Il est déconseillé d’exécuter et de migrer SQLite dans un environnement de production, sauf si vous êtes très conscient des risques et de ses limites. Le support fourni par Django est conçu pour permettre aux développeurs d’utiliser SQLite sur leurs machines locales pour développer des projets Django moins complexes sans avoir besoin d’une firebase database complète.

Lorsqu’une migration échoue dans django-south, les développeurs vous encouragent à ne pas utiliser MySQL:

! The South developers regret this has happened, and would ! like to gently persuade you to consider a slightly ! easier-to-deal-with DBMS (one that supports DDL transactions) 

Pour append aux réponses précédentes:

  • “La recherche en texte intégral pourrait être mieux supscope pour MySQL”

L’index FULLTEXT dans MySQL est une blague.

  • Il ne fonctionne qu’avec les tables MyISAM, vous perdez ainsi les transactions ACID, les transactions, les contraintes, les relations, la durabilité, la concurrence, etc.
  • INSERT / UPDATE / DELETE dans une colonne TEXT de grande taille (comme un post de forum) reconstruira une grande partie de l’index. S’il ne rentre pas dans myisam_key_buffer, alors une grande IO se produira. J’ai vu un seul déclencheur d’insertion de forum sur 100 Mo ou plus d’E / S … pendant ce temps, la table des messages est exclusivement verrouillée!
  • J’ai fait quelques tests (il y a 3 ans, peut être obsolète …) qui ont montré que sur des jeux de données volumineux, le texte intégral postgres est 10 à 100 fois plus rapide que mysql et Xapian 10 à 100 fois plus rapide que postgres.

Les autres raisons non mentionnées sont l’optimiseur de requête extrêmement intelligent, le grand choix de types de jointure (fusion, hachage, etc.), l’agrégation de hachage, les index de base sur les tableaux, la recherche spatiale, etc.

Cette application sera-t-elle hébergée sur vos propres serveurs ou par une société d’hébergement? Assurez-vous que si vous utilisez une société d’hébergement, ils prennent en charge la firebase database de votre choix.

Il existe une différence de licence majeure entre les deux bases de données qui vous affectera si vous avez l’intention de dissortingbuer du code à l’aide de la firebase database. Les bibliothèques client de MySQL sont GPL et celles de PostegreSQL sont sous une licence de type BSD qui pourrait être plus facile à utiliser.