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

Gran número de columnas, Seleccionar todo toma una eternidad

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 un TEXT . 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.