enum ou tinyint(1)

  • Auteur de la discussion Auteur de la discussion thierry8
  • Date de début Date de début
WRInaute accro
référence: http://dev.mysql.com/doc/refman/5.0/fr/ ... ments.html

Bonjour,

je ne sais pas lequel il faut privilégier: enum ou tinyint(1)

- en terme de perf. pour mysql
- en terme d'utilisation espace


un cas d'utilisation:

compte_active (oui ou non : 1 ou 0)

Il semblerait d'après la référence que la taille occupée est identique (sauf si beaucoup d'élément dans le enum), c'est bien ça ? En revanche, je ne sais pas ce que ça donne en terme de perf.

Même si en terme d'espace cela est négligeable, je ne souhaite pas ce genre de commentaire, mais belle et bien savoir laquelle des deux méthodes est la mieux et dans quel circonstence.

Merci de vos conseils.
 
WRInaute passionné
1 ou 0 je mettrais un tinyint.

Les enums c'est bien pour des trucs un peu plus complexe (genre m,f,i (homme, femme, indterminé)) où tu veux limiter le nombre de réponse possible.

Le problème c'est que des trucs genre SUM sur un enum te retourneront le résultat par rapport a un numéro d'indexe (y'a ptéte moyen d'empécher ça remarque).
 
WRInaute discret
même pour 1 et 0, il vaut mieux utiliser un ENUM
Si l'on connait TOUTES les valeurs possibles (dans la limite du raisonnable en nombre de valeurs distinctes), le ENUM est performant.
Comme Bacteries l'a fait remarqué, si des calculs doivent être faits, il faut alors utiliser un format numérique comme TINYINT
 
WRInaute accro
Pour répondre à Bacteries et jarreweb, il n'y a aucun calcul.

Ma demande est bien de savoir en terme de perf. principalement ?
(sur une simple comparaison, sachant que le champ en question sera indexé)
L'utilisation d'un enum('oui','non') sera t-il aussi (ou plus) performant que l'utilisation d'un nombre entier comme tinyint(1) ?

MarvinLeRouge a dit:
tinyint(1) ne correspond pas à un enum, mais à un booléen (boolean est d'ailleurs un alias pour tinyint(1))
:? oui ça je sais...pouquoi avoir dis cela ?
 
WRInaute accro
Moi j'utiliserais plutôt un tinyint si c'est pour un booléen car ça prend moins de place mais ça se vaut en terme de perf je crois (>> ils en parlent ici <<)

et je me baserais aussi là-dessus :

(sur phpFrance : )
Utiliser ENUM et SET pour les chaînes lorsque cela est possible
Si un champ fait appel à un nombre défini de valeurs, préférez utiliser une colonne de type ENUM ou SET à une colonne de type chaîne.

Réduire la taille de ses champs
Essayez de réduire au maximum la taille de vos champs. Il vaut mieux utiliser, par exemple, SMALLINT que INT lorsque vous n'avez pas besoin de stocker des nombres trop importants. Pensez aussi à utiliser des colonnes de type UNSIGNED lorsque vous n'utilisez pas le signe négatif, cela permet de doubler la valeur des nombres que vous pouvez stocker (65535 pour un SMALLINT UNSIGNED).

Utiliser si possible des chaînes de longueur fixe



[un peu HS]Je suis tombée sur cette vidéo en cherchant plus de sources...[/HS]
 
WRInaute discret
Code:
Si un champ fait appel à un nombre défini de valeurs, préférez utiliser une colonne de type ENUM ou SET à une colonne de type chaîne.
c'est bien ce que je disais, il faut utiliser ENUM, meme si ce sont des chiffres
 
WRInaute accro
"Si un champ fait appel à un nombre défini de valeurs, préférez utiliser une colonne de type ENUM ou SET à une colonne de type chaîne."

: par rapport à une chaîne de caractères et non pas à un entier :
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Haut