InnoDB almacena tablas "anchas" de una manera diferente. En lugar de tener todas las columnas juntas en una sola cadena (más gastos generales, como longitudes, etc.), hace lo siguiente:
- Si el total de todas las columnas de una fila determinada supera los 8 KB, algunos de los datos se moverán a otra área de almacenamiento ("fuera de registro").
- Las columnas que se mueven fuera de registro dependen del tamaño de las columnas, etc.
- Los detalles dependen del
ROW_FORMAT
elegido. - "Off-record" es otro bloque (o bloques) de 16 KB.
- Más tarde, al hacer
SELECT *
(o al menos recuperando la(s) columna(s) no registrada(s)), debe realizar otra recuperación del disco.
¿Qué hacer?
- Reconsidere tener tantas columnas.
- Considere la "partición vertical", en la que tiene otra(s) tabla(s) que contiene(n)
TEXT
seleccionado columnas Sugiera seleccionar grupos de columnas según los patrones de acceso en su aplicación. - Para las columnas que suelen ser bastante largas, considere comprimirlas en el cliente y almacenarlas en un
BLOB
en lugar de unTEXT
. La mayoría del "texto" se reduce 3:1. Los blobs se envían fuera de registro al igual que los textos, sin embargo, estos blobs comprimidos serían más pequeños, por lo que es menos probable que se derramen. - Haga más procesamiento en SQL -- para evitar devolver todas las filas, o para evitar devolver el texto completo, etc. Cuando entrega a ciegas mucho texto a un cliente, la red y el cliente se convierten en un factor importante en el tiempo transcurrido, no solo el
SELECT
, en sí mismo.