Documente Academic
Documente Profesional
Documente Cultură
Desde la versin 5.1 existe la posibilidad de particionar nuestras tablas de forma horizontal (en
lneas), algo que nos puede ayudar en casos puntuales a mejorar el rendimiento de nuestra
base de datos. Resumiendo, este sistema nos permite dividir lgicamente una tabla muy
grande en otras ms pequeas, dentro de un rango de valores que nosotros indiquemos, de
forma que la consulta de datos sea ms rpida. Su uso es muy sencillo pero... cuando
debemos utilizarlo?
Cuando la tabla sea tan grande que los ndices no entren en RAM.
Hay que tener en cuenta que este particionado es totalmente transparente para el usuario (y
por lgica tambin para nuestra aplicacin) por lo que en el caso de decidirnos por esta
solucin el cambio ser poco dramtico. Solamente tendremos que tener en cuenta estos
detalles:
La columna que utilicemos para definir el rango de las particiones debe ser un INT, no
se acepta cualquier otro valor.
Si tenemos una clave nica o una primary key, esta debe usarse para particionar.
Si tenemos una tabla con millones de registros y hacemos una select, MySQL se deber
recorrer toda la tabla (en caso de no usar ndices, si estos ocupan ms que la RAM) o se tendr
que recorrer todos los ndices. Esto, contra ms grande es la tabla, mas ineficiente es:
Gracias al particionado es posible hacer una bsqueda en una fraccin mucho ms pequea
de nuestra tabla. Si la dividimos de forma que cada particin incluya 100 filas (particionando
por ID), MySQL sabe que el dato se tiene que encontrar en la segunda particin, por lo
que se evita tener que buscar en los restantes X millones de registros.
La mejora es clara, pero no siempre particionar nos va a dar mayor rendimiento. Si la tabla NO
es lo suficientemente grande incluso podemos degradar el rendimiento.
Tipos de fragmentacin
FRAGMENTACION VERTICAL
Alumno (cdigo, Nombre, apellido, grado, edad, asignaturas)
Esta relacin pude ser fragmentada verticalmente de la siguiente forma:
alumno1= cdigo, Nombre, apellido, edad ALUMNO
nombre
apellido
grado
edad
Asignatura
12345
Laura Camila
casas
Matemticas
124568
Jos Antonio
Rodrguez
espaol
ALUMNO1
CODIGO
NOMBRE
APELLIDO
EDAD
12345
Laura Camila
Casas
124568
Jos Antonio
rodrguez
ALUMNO2
Cdigo
Grado
Asignatura
12345
Matemticas
124568
Espaol
FRAGMENTACION HORIZONTAL
Alumno (cdigo, Nombre, apellido, grado, edad, asignaturas)
Cdigo nombre
Apellido
grado
edad
Asignatura
12345
Casas
Matemticas
Rodrguez
espaol
Majares
Matemticas
Laura Camila
Cdigo nombre
Apellido
12345
Casas
Matemticas
Majares
Matemticas
Cdigo nombre
Apellido
Rodrguez
Laura Camila
espaol
FRAGMENTACION MIXTA
Alumno (cdigo, Nombre, apellido, grado, edad, asignaturas)
Cdigo
nombre
Apellido
grado edad
12345
Laura Camila
Casas
124568
Jos Antonio
Rodrguez
876334
Oscar Ernesto
Majares
Cdigo
nombre
Apellido
grado Asignatura
12345
Laura Camila
Casas
Matemticas
124568
Jos Antonio
Rodrguez
espaol
876334
Oscar Ernesto
Majares
Cdigo
nombre
Apellido
grado edad
Asignatura
12345
Laura Camila
Casas
Matemticas
Matemticas
124568
Jos Antonio
Rodrguez
876334
Oscar Ernesto
Majares
3
2
espaol
Matemticas
Fragmentacin en MySQL
Al utilizar comandos de fragmentado a nivel de tablas, mysqld utiliza una clave de particin y un
algoritmo de particionado para determinar la divisin de los datos entre los fragmentos. Los
algoritmos de fragmentacin que tenemos son:
RANGE: Si la clave de fragmentacin est dentro de un rango de valores.
LIST: El fragmento es seleccionado de acuerdo a una lista de valores enteros.
HASH: El fragmento se elige de acuerdo a una funcin de hash.
KEY: Un algoritmo interno es utilizado por mysqld para elegir como sern distribuidos los datos
entre los fragmentos..
);
Fragmentado HASH (Por dispersin)
El uso de HASH nos permite dividir los datos de forma equitativa entre todas las particiones,
cosa que con otros tipos de particiones podra no pasar. De esta forma, si estamos trabajando
una tabla enorme y la queremos dividir en 10 particiones, estas tendrn un nmero de valores
muy similar.
2844047 |
+----------+
1 row in set (1.66 sec)
255785 |
+----------+
1 row in set (2.39 sec)
Fijaros en el tiempo que ha tardado MySQL en realizar la consulta, 2.39 segundos. Bastante
tiempo, si en lugar de una sola consulta fuesen 100 concurrentes estaramos ante un verdadero
problema de rendimiento.
255785 |
+----------+
1 row in set (0.22 sec)
La bsqueda de los salarios del ao 2000. Antes 2,39 segundos, ahora 0,22. La mejora es
impresionante.
Un explain partitions nos indica que particin ha usado para la select: