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

MySQL:tabla larga vs tabla ancha

En primer lugar, estos son dos modelos de datos diferentes adecuados para diferentes propósitos.

Dicho esto, espero que el segundo modelo sea más rápido para la agregación, simplemente porque los datos se empaquetan de forma más compacta, por lo que necesitan menos E/S:

  • El GRUPO POR en el primer modelo se puede satisfacer con un completo escanear en el índice {size, price} . La alternativa al índice es demasiado lento cuando los datos son demasiado grandes para caber en la RAM.
  • La consulta en el segundo modelo se puede satisfacer mediante un análisis completo de la tabla. No se necesita índice.

Dado que el primer enfoque requiere tabla + índice y el segundo solo la tabla, la utilización de la memoria caché es mejor en el segundo caso. Incluso si ignoramos el almacenamiento en caché y comparamos el índice (sin tabla) en el primer modelo con la tabla en el segundo modelo, sospecho que el índice será más grande que la tabla, simplemente porque registra físicamente el size y tiene "agujeros" sin usar típicos de B-Trees (aunque lo mismo es cierto para la tabla si es agrupado ).

Y finalmente, el segundo modelo no tiene la sobrecarga de mantenimiento del índice, lo que podría afectar el rendimiento de INSERT/UPDATE/DELETE.

Aparte de eso, puede considerar almacenar en caché SUM y COUNT en una tabla separada que contenga solo una fila. Actualice SUM y COUNT a través de disparadores cada vez que se inserte, actualice o elimine una fila en la tabla principal. Luego puede obtener fácilmente el promedio actual, simplemente dividiendo SUM y COUNT.

Pero realmente deberías medir en cantidades representativas de datos para estar seguros.

Dado que no hay una cláusula WHERE en su consulta, se escanearán todas las filas. Los índices solo son útiles para obtener un subconjunto relativamente pequeño de las filas de la tabla (y a veces para escaneos de solo índice ). Como regla general, si se necesita más del 10 % de las filas de la tabla, los índices no ayudarán y el DBMS a menudo optará por una exploración completa de la tabla, incluso cuando haya índices disponibles.