2009-01-25 7 views
45

Je me demande s'il y a un effet positif dans l'utilisation de l'indicateur UNSIGNED pour définir un champ entier dans MySQL? Est-ce que cela rend les requêtes plus rapides ou les bases de données plus petites? Ou devrais-je m'en préoccuper seulement si je suis préoccupé par la limite supérieure?Signé ou non signé dans MySQL

Répondre

53

Selon section 10.2 du MySQL 5.1 Manuel:

En mode non-stricte, lorsqu'une out-of-plage de valeurs est attribuée à une colonne de type entier , MySQL stocke la valeur représentant la concordance extrémité du type de données de colonne . Si vous stockez 256 dans une colonne TINYINT ou TINYINT UNSIGNED, MySQL stocke respectivement 127 ou 255. Quand un à virgule flottante ou à virgule fixe colonne est affectée une valeur qui dépasse la plage impliquée par la spécifiée (ou par défaut) précision et une échelle, MySQL stocke la valeur représentant le point d'extrémité correspondant de cette gamme.

L'utilisation de UNSIGNED n'est donc vraiment nécessaire que lorsque vous êtes concerné par la limite supérieure. L'ajout d'UNSIGNED n'affecte pas non plus la taille de la colonne, mais le numéro represented.

+6

De même, il existe une amélioration des performances par rapport à l'index pour les cas où vous ne stockez que des valeurs non signées. Comme @ kevin-loney a dit, il peut gagner du temps sur l'indexation des valeurs supérieures. S'il vous plaît voir [l'article que j'avais écrit] (http://rakesh.sankar-b.com/2010/08/25/mysql-unsigned-int-to-signed-int-performance-tips-index/) à propos de l'utilisation type non signé sur signé. –

+2

VOUS ÊTES UN ROI, ROI, BRO! Vous venez de me sauver beaucoup de cerveau f ... par la direction ci-dessus. :-) Je vous remercie! –

9

Utilise unsigned lorsque la colonne est uniquement destinée à contenir des nombres positifs.

Cela n'affectera pas les performances d'E/S sur la colonne, car elle occupera exactement la même quantité d'espace.

21

Cela n'a pas d'importance sauf si vous essayez de tirer le meilleur parti de votre argent des valeurs et n'avez pas besoin de valeurs négatives. Par exemple, supposons que vous vouliez stocker 0-255.

Vous pouvez utiliser une tinyint mais seulement si vous l'utilisez comme non signé.

Beaucoup de bases de données que j'ai vues, les gens ne s'embarrassent pas de l'optimisation de ce genre et se retrouvent avec des tables plutôt grandes parce qu'ils utilisent simplement des INTs tout le temps. Cependant, si vous parlez de int vs unsigned int, il n'y a aucun effet de performance ou d'espace. Du point de vue des standards, j'utilise toujours unsigned et n'utilise que signé quand je sais que je vais avoir besoin de valeurs négatives.

17

Quand il s'agit de performance ou de stockage, c'est absolument la même chose. En règle générale, utilisez la règle qui vous convient le mieux: si vous n'avez besoin que de valeurs positives, stockez les valeurs sous UNSIGNED, sinon, laissez la valeur par défaut [SIGNED]. Un problème survient lorsqu'une valeur SIGNED est définie pour une colonne PRINCARY AUTOINCREMENT: le comptage des nombres générés automatiquement commence par 1 (pas le plus petit nombre négatif) et les valeurs possibles se terminent plus tôt, car vous utiliserez uniquement une moitié de valeurs. Donc, dans ce cas (colonne PRIMARY + AUTOINCREMENT), il est préférable de stocker comme UNSIGNED.

4

Il permettra d'améliorer la peroformance, laisse supposer si vous voulez rechercher la quantité < 50o.Sans "unsigned": Le flux de processus, puisque le champ de quantité est un "int" et vous avez un index de ce champ, MySQL définira la plage comme -2147483648 à 500 et il obtiendra le résultat basé sur ce gamme. Avec "unsigned": Flux de processus, puisque le champ de quantité est un "int" avec "unsigned" et vous avez un index de ce champ, MySQL définira la plage de 0 à 500 et il obtiendra le résultat basé sur cette gamme.

1

Avertissement, il y a un problème avec Unsigned Int (UINT) et Entity Framework ou ADO.NET. Il peut impliquer un problème d'intégration par la version MySql 6. Connecteur

Dans mon expérience, UInt est lu comme Long par l'EF, ce qui pourrait soulever des problèmes de précision, puisque UInt n'est pas Long. Cela pourrait causer des maux de tête à quiconque n'est pas familier avec le problème.

Autres préoccupations:

Integration problem between EF and Mysql Connector 6

DBContext cannot use UINT

EF provider trouble with UINT

3

Ici vous pouvez voir les MySQL documentation pour les gammes de SIGNÉS contre UNSIGNED. INTs Vous remarquerez rapidement que le plancher d'un INT non signé est toujours 0, donc il ne peut jamais être négatif.

Type Storage Minimum Value Maximum Value 
     (Bytes) (Signed/Unsigned) (Signed/Unsigned) 
TINYINT  1 -128   127 
       0    255 
SMALLINT 2 -32768   32767 
       0    65535 
MEDIUMINT 3 -8388608  8388607 
       0    16777215 
INT   4 -2147483648  2147483647 
       0    4294967295 
BIGINT  8 -9223372036854775808 9223372036854775807 
       0    18446744073709551615 
Questions connexes