martes, 17 de mayo de 2016

El infierno de los campos TEXT en MySQL

¡CUIDADO CON LOS CAMPOS TEXT / BLOB en MySQL!

Esta semana nos hemos dado bastantes estocazos contra la pared por culpa de los campos Text en MySQL. El principal motivo es que MySQL no los carga en  memoria, de tal forma que si una consulta tiene tablas con campos Text, MySQL accede a disco para manipular cada una de las filas. Esto ralentiza mucho ciertas operaciones, además de que consume muchísima CPU.

La cosa se hace mucho más grave si encima en la consulta no hacemos uso de esos campos. ¡A MySQL le da igual! Si la tabla tiene campos Text, le da igual que tu no los vayas a manipular en tu consulta. Esto es así porque en la estructura interna de datos que emplea para manejar los registros de una tabla, si ésta tiene campos Text no almacena el valor del campo, sino un puntero a un recurso a disco. Es como si el campo Text fuera un fichero, y MySQL en sus registros internos lo que almacena es la URL / Path del fichero.

Ejemplos de este tipo podemos encontrar muchos:
  • Un sistema de blogging, en el que el contenido de los posts lo tengamos en campos Text, mientras que los metadatos (autor, fecha de creación, categoría de contenido) en campos estructurados.
  • etc

Moraleja: A la hora de diseñar tu tabla, si junto con los campos Text tienes otro tipo de campos, que vayas a utilizar de forma independiente, separalos en tablas distintas. Optimizarás mucho las operaciones que no involucren campos Text, hasta tal forma que te compensará hacer un JOIN cuando sí lo involucren.