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) 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 y vertical. ¡Vamos a los detalles!
- 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). Ejemplo: tenemos tres tablas registro2001, registro2002, registro2003 y en cada tabla guardamos los registros de los años correspondientes, esto nos garantiza una mejora en el rendimiento 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 base de datos 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 cómo 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:
En el ejemplo de MySQL se puede observar la gran diferencia de rendimiento 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!