73 votes

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

Mon projet Django va être soutenu par une grande base de données avec plusieurs centaines de milliers d'entrées, et devra supporter la recherche (je finirai probablement par utiliser djangosearch ou un projet similaire).

Quel backend de base de données est le mieux adapté à mon projet et pourquoi ? Pouvez-vous me recommander de bonnes ressources pour une lecture plus approfondie ?

66voto

oivvio Points 1001

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

Si vous n'êtes pas lié à un quelconque héritage et que vous avez la liberté de choisir un back-end de base de données, nous recommandons PostgreSQL, qui atteint un excellent entre le coût, les fonctionnalités, la vitesse et la stabilité. ( Le guide définitif de Django , p. 15)

48voto

Van Gale Points 21982

J'ai récemment transféré un projet de MySQL à Postgresql et je ne regrette pas ce changement.

La principale différence, du point de vue de Django, est la vérification plus rigoureuse des contraintes dans Postgresql, ce qui est une bonne chose, et aussi le fait qu'il est un peu plus fastidieux de faire des changements de schéma manuels (aka migrations).

Il existe probablement environ six applications de migration de bases de données Django et au moins une ne prend pas en charge Postgresql. Je ne considère pas cela comme un inconvénient car vous pouvez utiliser l'une des autres ou les faire manuellement (ce que je préfère pour l'instant).

Recherche en texte intégral pourrait être mieux pris en charge pour MySQL. MySQL dispose d'une fonction intégrée de recherche en texte intégral prise en charge par Django, mais elle est plutôt inutile (pas d'extraction de mots, de recherche d'expressions, etc.) J'ai utilisé django-sphinx comme une meilleure option pour la recherche plein texte dans MySQL.

La recherche en texte intégral est intégrée à Postgresql 8.3 (les versions antérieures nécessitent le module TSearch). Voici un bon article d'instruction sur le blog : Recherche en texte intégral dans Django avec PostgreSQL et tsearch2

4 votes

À partir de Django 1.7, migrations font désormais partie intégrante de Django.

42voto

vartec Points 53382

grande base de données avec milliers d'entrées,

Ce n'est pas une grande base de données, c'est une très petite.

Je choisirais PostgreSQL, car il a beaucoup plus de fonctionnalités. La plus importante dans ce cas : avec PostgreSQL, vous pouvez utiliser Python comme langage procédural.

78 votes

"Ce n'est pas une grande base de données, c'est une très petite." Eh bien, elle est plus petite que les bases de données plus grandes qu'elle, et plus grande que les plus petites.

11voto

Joonas Pulakka Points 20361

Choisissez celle qui vous est la plus familière. MySQL contre PostgreSQL est une guerre sans fin. Les deux sont d'excellents moteurs de base de données et sont tous deux utilisés par des sites majeurs. En pratique, cela n'a pas vraiment d'importance.

0 votes

La question précise clairement qu'il faut évaluer la base de données du point de vue de Django. Ce n'est donc pas pertinent.

0 votes

Je ne suis pas d'accord avec cela, voir ma réponse ci-dessous, pourquoi j'ai commencé avec MySQL parce que je connaissais très bien MySQL, mais je l'ai regretté par la suite.

8voto

Kedare Points 743

Même si Postgresql a l'air mieux, je trouve qu'il a quelques problèmes de performances avec Django :

Postgresql est conçu pour gérer les "longues connexions" (mise en commun des connexions, connexions persistantes, etc.)

MySQL est conçu pour gérer les "connexions courtes" (se connecter, faire ses requêtes, se déconnecter, a quelques problèmes de performances avec beaucoup de connexions ouvertes )

Le problème est que Django ne prend pas en charge la mise en commun des connexions ou la connexion persistante, il doit se connecter/déconnecter à la base de données à chaque appel de vue.

Il fonctionne avec Postgresql, mais se connecter à une base de données Postgresql coûte BEAUCOUP plus cher que de se connecter à une base de données MySQL (sur Postgresql, chaque connexion a son propre processus, c'est beaucoup plus lent que de simplement lancer un nouveau thread dans MySQL).

Ensuite, vous disposez de certaines fonctionnalités comme le cache de requête qui peut être vraiment utile dans certains cas. (Mais vous avez perdu la superbe recherche de texte de PostgreSQL).

9 votes

Django 1.6 ajoute la prise en charge des connexions persistantes, ce qui ne devrait plus poser de problème.

0 votes

Pour la connexion persistante, nous pouvons définir "conn_max_age" dans la configuration de la base de données à une valeur positive qui est en secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X