miércoles, abril 29, 2009

Incrementar rendimiento de BBDD con "Particionado de Tablas"

Con la aparición de la versión 5.1 de MySQL, se incluyó en éste el particionado de tablas (algo que en PostgreSQL ya existía hace tiempo enlace) por lo que me he animado a escribir sobre el tema.
El particionado de tablas es una técnica que se usa para reducir la cantidad de lecturas físicas a la base de datos cuando ejecutamos consultas, existen dos principales modalidades de particionado:

  • Horizontal: Esta modalidad consiste en tener varias tablas con las mismas columnas en cada una de ellas y distribuir la cantidad de registros en estas tablas (generalmente se particiona separando la data por años, meses, etc). Ej: Tenemos tres tablas registro2001, registro2002 y registro2003 y en cada tabla guardamos los registros de los años correspondientes, esto nos garantiza un incremento considerable cuando realicemos consultas sobre las tablas ya que la data estará distribuida en tres partes y ya sabríamos dependiendo del año en cual tabla buscar.

  • Vertical: Esta modalidad generalmente la aplicamos en nuestros diseños de BBDD sin darnos cuenta, por ejemplo cuando tenemos una columna de tipo BLOB con una fotografía o un texto muy largo que no leemos frecuentemente y decidimos ponerla en otra tabla referenciandola con la clave foránea.

Ahora bien, el particionado horizontal es el que vamos a comentar, ya que el problema radica en como hacer para que nuestras aplicaciones sepan en que tabla guardar el registro dependiendo del año (porque obviamente no le vamos a agregar esas condiciones a nuestra aplicación), esto se logra agregando una serie de sentencias y condiciones en la definición de las tablas.
En los siguientes enlaces se muestra como hacerlo: MySQL y PostgreSQL
En el ejemplo mostrado de MySQL se puede observar la gran diferencia con dos tablas que tienen exactamente la misma data (8 millones de registros) una sin particionar y la otra particionada por años, al realizar una consulta filtrando por la columna en la cual se basó el particionado se obtuvieron los siguientes resultados:
  • Tabla sin particionado: 38.30 segundos
  • Tabla con particionado: 0.34 segundos
¡Asombroso nooo!

2 comentarios:

  1. Muy funcional esta tecnica para seccionar una tabla de muchos registros que incremente el tiempo de respuesta y asi mejorar los procesos.

    Gracias por el aporte.

    ResponderBorrar
  2. Muy funcional esta tecnica para seccionar una tabla de muchos registros que incremente el tiempo de respuesta y asi mejorar los procesos.

    Gracias por el aporte.

    ResponderBorrar