martes, 20 de enero de 2009

Número de columnas máximo en MySQL

¿Se os ha pasado alguna vez por la cabeza poner a prueba el aguante y rendimiento de una base de datos? Sí, ¿verdad? Yo mismo, hace no mucho, estuve "jugando" con MySQL, ejecutando repetidamente desde una aplicación .NET tandas de 100.000 inserts, pruebas en las que el timeout por defecto del conector de base de datos utilizado no hacía más que quejarse ;-).

Si es que no lo puedo negar, ¡me flipa el mundillo de las bases de datos! Me ha gustado desde siempre eso de modelar y relacionar entidades y objetos del mundo real a través de diagramas de E/R. Todavía me acuerdo en la carrera, cuando en los exámenes de la asignatura "Bases de Datos", había que modelar, ¡en un folio en blanco!, el enunciado que se daba por medio de diagramas de E/R..., ¡qué tiempos aquellos!

En fin, es un tema y un currelo estresante, pero sin duda, muy interesante. ¿A quién no le gustaría ser un DBA de una base de datos Oracle? Sí, lo sé, supone gestionar un monstruo de base de datos y comerte miles de marrones..., pero si te gusta el mundillo y eres bueno en ello, los miles de euros que recibirás a final de mes seguro que te hacen olvidar todas las penas ;-). Siempre se ha dicho/oído que los DBAs son los profesionales de la rama de la informática que más ganan...

Sobra decir que no soy DBA (de momento ;-)), por lo que me tengo que contentar con discurrir y poner en práctica de vez en cuando mis ideas maquiavélicas para buscar las cosquillas de las bases de datos, en este caso, una vez más, las cosquillas de MySQL.

¿La idea maligna de hoy? Conocer el número de columnas máximo que puede tener una tabla de MySQL.

Admito que la idea es un tanto extraña y extrema, porque doy por hecho que el 99.9% de la gente que diseña bases de datos no se preocupa de esto en absoluto; es más, much@s seguro que en la vida se habían hecho esta pregunta. Sin embargo, la problemática está ahí, como tod@s sabemos, muchas veces se opta por añadir columnas sin ton ni son a tablas que de por sí tienen un montón de columnas y filas. Por eso, recientemente se me ocurrió investigar si MySQL establecía un límite para el número de columnas por tabla. Gracias a este excelente artículo de la ayuda de MySQL, hoy os confirmo que MySQL sí tiene un limite para el número de columnas por tabla.

Resumiendo y customizando lo allí leído, para empezar, ninguna tabla de MySQL puede tener más de 4096 columnas, siendo esta cifra el tope de los topes. Aún así, hay otros factores que hacen que este número máximo de columnas por tabla disminuya significativamente en MySQL:
  • Las tablas tienen un tamaño de fila máximo (row size) de 65.535 bytes, longitud que depende en gran medida del tipo de dato que almacene cada columna. Lógicamente, no ocupa lo mismo un valor de tipo TINYINT (1 byte) que una columna de tipo VARCHAR(255) codificada en UTF-8 (255 x 3 bytes por carácter UTF-8 + 2 bytes para guardar la longitud del valor=767 bytes). Por ejemplo, los campos declarados por defecto a NULL también ocupan bytes extra. Por tanto, si nuestro row size o la suma de bytes que ocupan las columnas de la tabla pasa de 65.535 bytes, ¡sálvese quien pueda!
  • El límite del fichero de definición de tabla (fichero .frm) no puede exceder de los 64 KBytes. En este factor influye algo que apriori parece totalmente inofensivo, como es la longitud del nombre de las columnas; si utilizamos columnas con nombres largos (entre otras cosas), el ficherito de marras irá creciendo poco a poco...
  • Tipo de storage engine. Cada storage engine de MySQL tiene sus propias restricciones, entre los que destaca, todo sea dicho, para mal, InnoDB, un motor muy utilizado para bases de datos que han de soportar transacciones. InnoDB restringe, de entrada, la cifra máxima de columnas por tabla a 1000, con un row size de 8000 bytes.
¿A que al principio del post el límite sonaba lejos, muy lejos, casi irreal? ¿Y ahora ;-)? Estoy seguro que a más de un@ le han sorprendido las restricciones en el número máximo de columnas por tabla de MySQL, sobre todo las restricciones específicas del motor InnoDB.

Eso sí, a pesar de las restricciones, creo que el número máximo de columnas es suficientemente alto como para no tener problemas. ¿Que por una extraña razón (que no sea un mal diseño) andamos rozando el límite máximo de columnas? No hay muchas opciones que no pasen por un proceso de rediseño y tunning de la correspondiente tabla; a veces un rediseño sirve para darse cuenta de que no se han optimizado los tipos de datos de las columnas, también puede dar lugar a extraer cierta información a otras tablas que luego se relacionarán mediante claves externas, etc. No hay mal que por bien no venga, o aplicado a este área, no hay nada que un buen rediseño de la base datos no solucione ;-).

¿Conoce alguien si otras bases de datos como SQL Server, Oracle o PostgreSQL tienen un límite máximo para el número de columnas de una tabla? ¿Alguna otra restricción curiosa de MySQL con la que os hayáis topado?

SaludoX.


5 comentarios:

Anónimo dijo...

Pero tío, ¿dónde dan el título al tocamiento de gónadas a los DBMS? Jejejeje, lo tuyo no es normal, de verdad, ahí venga a darle al pobre MySQL donde más le duele, de verdad :P

Bromas aparte, la verdad es que resulta interesante conocer estos detallitos que, como dices, no solemos tener en cuenta peeeeero ahí están, y a la primera de cambio nos podemos encontrar con unas limitaciones que nos obliguen a rediseñar todo el trabajo que teníamos ya hecho.

Así que como la curiosidad mató al gato, y yo tengo dos, los he puesto a trabajar a ver qué les pasa. Uno me ha dicho que SQL Server es capaz de almacenar algunas columnitas más que Oracle, pero como son las primeras horas de la mañana y tengo que salir ya para el currele, luego lo veré con más detalle.

Gracias por incitarnos a investigar, y por tan excelentes artículos :)

¡Salud!

Anónimo dijo...

Gracias por los links Lobosoft, les echaré un vistazo sin falta, que nunca está de más comparar con otros DBMSs.

Como dices, parece que últimamente me ha dado por buscar "límites" o casos extremos en todo el software que me rodea; es una nueva faceta que estoy descubriendo y que sinceramente me divierte cada día más. Aparte, veo que me permite aprender detalles y entresijos tan interesantes como lo comentado en el artículo.

Está bien esto de trabajar como tecnólogo beta tester, una pena que no me paguen como a un DBA :-(.

Me alegro mucho que alguno de mis posts encienda de vez en cuando esa "mecha investigadora" que tod@s, o casi tod@s, llevamos dentro ;-).

SaludoX.

manolo dijo...

La verdad que están pinados, no saben nada... son españoles por casualidad¿?

pata_de_jaguar dijo...

Caray... yo pasé 48 horrorosas horas al tener un error en producción de una tabla InnoDB con 78 Columnas, donde no encontré la solución (no Guardaba en registro en disco) lo único que me funcionó fué eliminar dos columnas... aún estoy flipado.

EColonials dijo...

En fin, para una tabla usuarios por ejemplo, cuánto es el límite de columnas cuando se está creando?? Pregunto eso por la optimizacion de tablas ya que dicen que no se puede pasar de 20 campos, otros que de 60.... En fin, cuál es el límite por tema de optimización y estándar profesional...?