sql >> Base de Datos >  >> RDS >> Mysql

Rendimiento de MySQL BIGINT (20) frente a Varchar (31)

Esto realmente tendría que medirse, podemos hacer algunas "conjeturas" basadas en lo que sabemos y en lo que asumimos, pero esas son solo conjeturas.

No menciona si esta tabla es InnoDB, MyISAM con filas dinámicas o MyISAM con filas de longitud fija. Eso hará alguna diferencia.

Pero para valores como el que publicaste, '961637593864109_412954765521130' (31 caracteres), asumiendo que está usando un juego de caracteres de un solo byte (por ejemplo, latin1), o un juego de caracteres que codifica esos caracteres en particular en un solo byte (por ejemplo, utf8)...

Para el formato dinámico InnoDB y MyISAM, son 31+1-8=24 bytes adicionales para esa fila. (BIGINT cabe en 8 bytes, un valor VARCHAR(31) de 31 caracteres usará 32 bytes).

Para la tabla MyISAM con filas de longitud fija, sería una diferencia de 23 bytes por fila. (El espacio está reservado para los 31 caracteres y no es necesario almacenar la longitud).

Ese valor de clave principal también se repetirá en cada índice, por lo que también hay más espacio con cada índice.

Asumiendo que las filas de su tabla son de 120 bytes usando BIGINT y las filas son de 144 bytes con VARCHAR, eso es un 20% aumentar. Cuanto más grandes sean las filas, menor será el porcentaje de aumento y viceversa.

Para 1,000,000 filas (quiero decir "una sola fila" de la misma manera que el Dr. Evil pone su dedo meñique en la comisura de la boca y dice "un millón de dólares"), esos 24 bytes adicionales por fila suman alrededor de 24 MB.

Pero en realidad no es tan fácil. En términos de espacio InnoDB, se trata de cómo las filas "encajan" en un bloque. Cuanto mayor sea el tamaño de fila promedio, mayor será la cantidad de espacio libre en un bloque.

Si no hace nada con las filas excepto almacenarlas en el disco, en realidad se trata solo de un aumento en el espacio en disco y más tiempo y espacio para las copias de seguridad.

Si en un bloque cabe el mismo número de filas de "144 bytes" que de filas de "120 bytes", entonces no verá ninguna diferencia en el espacio. Pero si caben menos filas en un bloque, son más bloques, más espacio en el grupo de búfer de InnoDB, más E/S, etc.

Para consultas de una sola fila, ya sea por valor de clave principal o por alguna otra búsqueda de índice única, la diferencia será insignificante.

Si está tratando con conjuntos de resultados más grandes, entonces eso es memoria adicional para preparar el conjunto de resultados y bytes adicionales para transferir al cliente, etc.

Si la clave VARCHAR está diseñada de tal manera que los "grupos" de filas a las que se accede juntas tienen la misma parte inicial del valor de la clave, entonces con InnoDB, en realidad puede haber alguna mejora en el rendimiento. Esto se debe a que la clave principal es la clave del clúster... hay muchas más posibilidades de que las filas necesarias para satisfacer una consulta estén en el mismo bloque, en lugar de estar distribuidas en un montón de bloques.

Lo contrario es que si se realizan inserciones y eliminaciones, habrá más espacio libre en algunos bloques. (Con las eliminaciones, el espacio para las filas eliminadas permanece en el bloque; para reutilizarlo, debe insertar una fila que tenga el mismo valor clave (o al menos un valor clave lo suficientemente cerca como para que caiga en el mismo bloque .) Y con inserciones aleatorias, obtendremos divisiones de bloques.