2009-01-25 11 views
45

Me pregunto si hay algún efecto positivo al usar el indicador UNSIGNED para definir algún campo entero en MySQL. ¿Hace que las consultas sean más rápidas o la base de datos más pequeña? ¿O debería molestarme solo si me preocupa el límite superior?Firmado o sin firmar en MySQL

Respuesta

53

Según section 10.2 del Manual de MySQL 5.1:

En el modo no estricta, cuando un fuera de la gama valor se asigna a una columna de número entero, MySQL almacena el valor que representa la correspondientes punto final del tipo de datos de columna rango. Si almacena 256 en una columna TINYINT o TINYINT SIN CARGO, MySQL almacena 127 o 255, respectivamente. Cuando a-punto flotante o columna de punto fijo se le asigna un valor que excede el rango implicado por la precisión especificada (o predeterminado) y la escala, MySQL almacena el valor que representa la correspondiente punto final de ese rango.

Por lo tanto, usar UNSIGNED solo es realmente necesario cuando le preocupa el límite superior. Además, agregar UNSIGNED no afecta el tamaño de la columna, solo cómo el número es represented.

+6

Además, hay una mejora en el rendimiento con respecto al índice para aquellos casos en los que solo almacena valores sin firmar. Como dijo @ kevin-loney, puede ahorrar tiempo en la indexación de valores de límite superior. Por favor vea el [artículo que yo había escrito] (http://rakesh.sankar-b.com/2010/08/25/mysql-unsigned-int-to-signed-int-performance-tips-index/) sobre el uso unsigned type over signed. –

+2

¡ERES UN REY, REY, BRO! Acabas de salvarme un montón de cerebro ... por la gerencia de arriba. :-) ¡Gracias! –

9

Use sin signo cuando la columna solo contenga números positivos.

No afectará el rendimiento de E/S en la columna, ya que ocupará exactamente la misma cantidad de espacio.

21

No importa a menos que esté tratando de sacar el mayor provecho de los valores y no necesite valores negativos.

Por ejemplo, supongamos que quiere almacenar 0-255.

Puede usar una minúscula, pero solo si la usa como no firmada.

Muchas de las bases de datos que he visto, las personas no se molestan en optimizar de esta manera y terminan con algunas tablas bastante grandes porque solo usan INTs todo el tiempo.

Aún así, si estás hablando de int vs unsigned int, no hay efecto de rendimiento o efecto de espacio en absoluto.

Desde el punto de vista de las normas, siempre uso unsigned y solo uso firmado cuando sé que necesitaré valores negativos.

17

Cuando se trata de rendimiento o almacenamiento, es absolutamente lo mismo.

Como regla general, use la que más le convenga: si solo necesita valores positivos, almacene los valores como SIN FIRMAR; de lo contrario, que sea el valor predeterminado [FIRMADO].

Surge un problema cuando se establece un valor FIRMADO para una columna PRIMARY AUTOINCREMENT: el recuento de los números autogenerados comienza con 1 (no el número negativo más pequeño) y los valores posibles finalizarán antes, ya que solo usará una mitad de valores. Entonces, en este caso (columna PRIMARY + AUTOINCREMENT), es mejor almacenar como UNSIGNED.

4

Mejorará el rendimiento, supongamos que si desea buscar la cantidad < 50o.

Sin "unsigned": Flujo de proceso, ya que el campo de cantidad es un "int" y tiene un índice de este campo, MySQL definirá el rango como -2147483648 a 500 y obtendrá el resultado basado en esto distancia.

Con "unsigned": Flujo de proceso, ya que el campo de cantidad es un "int" con "unsigned" y tiene un índice de este campo, MySQL definirá el rango de 0 a 500 y obtendrá el resultado basado en este rango

1

Advertencia, hay un problema con Unsigned Int (UINT) y Entity Framework o ADO.NET. Se podría implicar un problema de integración según la versión de MySQL Connector 6.

En mi experiencia, UInt se lee como Long por la EF, lo que podría plantear algunas cuestiones de precisión, ya que no es UIntLong. Podría causar dolores de cabeza a cualquiera que no esté familiarizado con el problema.

Otras preocupaciones:

Integration problem between EF and Mysql Connector 6

DBContext cannot use UINT

EF provider trouble with UINT

3

Aquí se puede ver la MySQL documentation para los rangos de FIRMADOS vs. SIN FIRMA intercepciones. Notarás rápidamente que el piso para una INT NO FIRMADA siempre es 0, por lo que nunca puede ser negativo.

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 
Cuestiones relacionadas