php mysql enums tinyint

php - TINYINT vs ENUM(0, 1) para valores booleanos en MySQL



enums (5)

¿Cuál es mejor, Tinyint con valores 0 y 1 o ENUM 0,1 en las tablas MyISAM y MySQL 5.1?


Enum, de alguna manera da una "pista" para los desarrolladores o programadores. Pero generalmente, es mejor manejarlo programáticamente. Entonces, ya sea ENUM (0,1), BIT (1) Y TINYINT (1), todos usando 1 byte, sería mejor, en la mayoría de los casos, manejarse en el lado del cliente, en lugar de enviar 2 en el bit (1) o enumerar (0,1) al servidor y, a continuación, el servidor devolverá un error que deberá manejar de todos modos: utiliza más recursos (red + servidor CPU + cliente CPU x 2)

0 usualmente significa falso, 1 verdadero.


Mi investigación muestra que BIT (1) es un sinónimo de TINYINT (1) para las versiones de MySQL anteriores a 5.0.3.

Las versiones de MySQL después de 5.0.3 cambian la forma en que funciona el tipo de datos BIT. Ya no es un sinónimo de TINYINT y es el único tipo de datos que le permite almacenar cualquier cosa en menos de un byte.

Este tipo de datos puede ser preferible al uso de TINYINT o ENUM. Planeo probar para ver cuál es más rápido y el uso del espacio de los tres en mi blog. Hay un enlace en la parte inferior si te interesa ver los resultados de tamaño y velocidad. Testbed: caja de Pentium III de grado de consumidor desagradable que ejecuta OpenBSD y MySQL. (Con un cuadro de desarrollo de BD más lento, realmente puede sentir los efectos de un código incorrecto. Además, las diferencias entre las consultas de prueba son más perceptibles. Alternativamente, intente usar una máquina virtual con apenas recursos asignados).

La documentación oficial de MySQL.

El barón Schwartz tiene esto que decir al respecto.

http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/


Para obtener el mejor rendimiento y los requisitos de espacio , debe recopilar sus valores booleanos y guardarlos en el mismo TINYINT. P.ej. Guarda hasta 8 valores booleanos en un TINYINT. 16 valores booleanos en un SMALLINT, etc. Tanto BIT (1) como ENUM utilizan al menos 1 byte BIT(M) - approximately (M+7)/8 bytes consulte: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html . Por lo tanto, si está almacenando 1 valor booleano, usaría TINYINT ya que tiene la misma sobrecarga que BIT y ENUM, pero le ofrece la opción de almacenar 7 valores booleanos más tarde si lo necesita.


Yo sugeriría que el ENUM es preferible porque deja claro lo que se espera; Si me resta rendimiento en cualquier forma mensurable me sorprendería mucho. Para hacer un tinyint, este trabajo requeriría COMPROBAR una restricción en la columna; ninguno de los motores de almacenamiento MySQL actualmente admite esto.


Puede usar BIT(1) como se menciona en la referencia de mysql 5.1 . No recomendaré enum ni tinyint(1) ya que el bit(1) necesita solo 1 bit para almacenar el valor booleano, mientras que tinyint(1) necesita 8 bits.