sql >> Base de Datos >  >> RDS >> MariaDB

Diseño de base de datos 101:Particiones en MySQL

En esta publicación de blog, analizaremos una de las características más utilizadas de MySQL:las particiones.

¿Qué es el particionamiento?

En MySQL, el particionamiento es una técnica de diseño de bases de datos en la que una base de datos divide los datos en varias tablas, pero la capa SQL aún trata los datos como una sola tabla. En pocas palabras, cuando particiona una tabla, la divide en varias subtablas:la partición se usa porque mejora el rendimiento de ciertas consultas al permitirles acceder solo a una parte de los datos, lo que las hace más rápidas. Las operaciones de E/S también se pueden mejorar porque los datos y los índices se pueden dividir en muchos volúmenes de disco.

Hay dos tipos de partición:horizontal y vertical. La partición horizontal implica colocar diferentes filas en diferentes tablas, la partición vertical, por otro lado, implica la creación de tablas con menos columnas y el uso de tablas adicionales para almacenar las columnas restantes.

¿Cómo funciona la partición?

  • Cuando se utilizan consultas SELECT, la capa de partición abre y bloquea las particiones, el optimizador de consultas determina si alguna de las particiones se puede eliminar y luego la capa de partición reenvía las llamadas API del controlador al motor de almacenamiento que maneja las particiones.
  • Cuando se utilizan consultas INSERT, la capa de partición abre y bloquea las particiones, determina a qué partición debe pertenecer la fila y luego reenvía la fila a esa partición.
  • Cuando se utilizan consultas DELETE, la capa de partición abre y bloquea las particiones, determina qué partición contiene la fila y luego elimina la fila de esa partición.
  • Cuando se utilizan consultas de ACTUALIZACIÓN, la capa de partición abre y bloquea las particiones, determina qué partición contiene la fila, obtiene la fila y la modifica, luego determina qué partición debe contener la nueva fila, reenvía la fila a la nueva partición con una solicitud de inserción, luego reenvía la solicitud de eliminación a la partición original.

¿Cuándo debe usar el particionamiento?

En general, la partición es útil cuando:

  • Tiene muchos datos que necesita consultar.
  • Sus tablas son demasiado grandes para caber en la memoria.
  • Sus tablas contienen datos históricos y los nuevos datos se agregan a la partición más nueva.
  • Piensa que necesitará distribuir el contenido de una tabla entre diferentes dispositivos de almacenamiento.
  • Cree que necesitará restaurar particiones individuales.

Si uno o más de los escenarios descritos anteriormente describen su situación, la partición puede ayudar. Sin embargo, antes de particionar sus datos, tenga en cuenta que las particiones de MySQL tienen sus propias limitaciones:

  • Las expresiones de partición no permiten el uso de procedimientos almacenados, funciones almacenadas, funciones definidas por el usuario (UDF) o complementos, y con soporte limitado para funciones SQL. Tampoco puede usar variables declaradas o almacenadas.
  • Las tablas particionadas no pueden contener ni ser referenciadas por claves foráneas.
  • Hay un límite de 1024 particiones por tabla (a partir de MariaDB 10.0.4, las tablas pueden contener un máximo de 8192 particiones).
  • Una tabla solo se puede particionar si el motor de almacenamiento admite la partición.
  • La caché de consultas no reconoce la partición o la eliminación de particiones.
  • Todas las particiones deben usar el mismo motor de almacenamiento.
  • Los índices de TEXTO completo no son compatibles
  • Las tablas temporales no se pueden particionar

Las opciones anteriores deberían ayudarlo a decidir si la partición es una opción para usted o no.

Tipos de partición

Si decide utilizar particiones, tenga en cuenta que tiene varios tipos de particiones para elegir. Cubriremos brevemente sus opciones a continuación, luego profundizaremos en ellas:

  • Dividir por RANGO puede ayudarlo a particionar filas en función de los valores de columna que se encuentran dentro de un rango determinado.
  • La partición por LISTA puede ayudarlo a particionar filas en función de la pertenencia de los valores de columna en una lista determinada.
  • La partición por HASH puede ayudarlo a particionar filas en función de un valor devuelto por una expresión definida por el usuario.
  • La partición por KEY puede ayudarlo a particionar filas en función de una función hash proporcionada por MySQL.

Particionamiento por RANGO

El particionamiento por RANGE es una de las formas más populares de particionar tablas MySQL. Cuando particionas una tabla por RANGO, divides la tabla de tal manera que cada partición contiene una cierta cantidad de filas que se encuentran dentro de un rango determinado. Para definir una partición, defina el nombre de la misma, luego dígale qué valores debe contener; para particionar una tabla por rango, agregue una instrucción PARTICIÓN POR RANGO. Por ejemplo, si desea nombrar su partición p0 y hacer que contenga todos los valores menores que 5, deberá asegurarse de que su consulta contenga VALORES DE PARTICIÓN p0 MENOS DE (5). Aquí hay un ejemplo de una tabla particionada:

CREATE TABLE sample_table (

id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,

column_name VARCHAR(255) NOT NULL DEFAULT ‘’

...

) PARTITION BY RANGE (column_name) (

PARTITION p0 VALUES LESS THAN (5),

PARTITION p1 VALUES LESS THAN (10),

PARTITION p2 VALUES LESS THAN (15),

PARTITION p3 VALUES LESS THAN (20),

...

);

También puede definir una partición que contenga todos los valores que no caen en ciertos rangos, así:

PARTITION p5 VALUES LESS THAN MAXVALUE

La partición anterior se llama p5 y contiene todos los valores que otras particiones no tienen:MAXVALUE representa un valor que siempre es mayor que el valor más grande posible. También puede usar funciones definiendo sus particiones así:

PARTITION BY RANGE (YEAR(date)) (

    PARTITION p0 VALUES LESS THAN (2000),

    PARTITION p1 VALUES LESS THAN (2010),

    PARTITION p2 VALUES LESS THAN (2020),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);

En este caso, todos los valores inferiores a 2000 se almacenan en la partición p0, todos los valores inferiores a 2010 se almacenan en la partición p1, todos los valores inferiores a 2020 se almacenan en la partición p2 y todos los valores que no caen en ninguno de estos rangos se almacenan en la partición p3.

Particionamiento por LISTA

La partición de tablas MySQL por LISTA es similar a la partición por RANGO:la principal diferencia de la partición de tablas por LISTA es que cuando las tablas se particionan por LISTA, cada partición se define y selecciona en función de la pertenencia a un valor de columna en un conjunto de listas de valores en lugar de un rango de valores. La partición por LISTA puede ser útil cuando sabe que, por ejemplo, tiene datos que se pueden dividir en varios conjuntos de datos más pequeños (digamos, regiones). Suponga que tiene una tienda que tiene 4 franquicias:una en la parte central de la ciudad, la segunda en el norte, la tercera en el este, la cuarta en el oeste. Puede particionar una tabla de tal manera que los datos pertenecientes a una determinada franquicia se almacenen en una partición dedicada a esa franquicia:

PARTITION BY LIST(store) (

PARTITION central VALUES IN (1,3,5),

PARTITION north VALUES IN (2,4,7),

PARTITION east VALUES IN (8,9),

PARTITION west VALUES IN (10,11)

);

Particionamiento por HASH

La partición de tablas MySQL por HASH puede ser una forma de asegurarse de que los datos entre las particiones se distribuyan de manera uniforme. Si está particionando sus tablas por HASH, solo necesita especificar en cuántas particiones necesita que se dividan sus datos; MySQL se encarga del resto. Puede usar la partición por HASH agregando la siguiente declaración a CREATE TABLE:

PARTITION BY HASH(id)

PARTITIONS 5;

Reemplace 5 con el número que especifica en cuántas particiones necesita que se dividan sus datos; el número predeterminado es 1.

MySQL también admite la partición mediante HASH LINEAL:el hash lineal difiere del hash normal porque el hash lineal utiliza un algoritmo lineal de potencias de dos. Para particionar tablas por HASH LINEAL, reemplace PARTICIÓN POR HASH con PARTICIÓN POR HASH LINEAL.

Particionamiento por CLAVE

El particionamiento de tablas MySQL por KEY es similar al particionamiento de tablas MySQL por HASH; en este caso, el servidor MySQL proporciona la función hash para el particionamiento de claves. Cualquier columna que se utilice como clave de partición debe comprender la clave principal de toda la tabla o al menos ser parte de la clave principal de la tabla. Si no se especifica ningún nombre de columna como clave de partición, se utilizará la clave principal. Si no hay una clave principal, pero hay una clave única, se utilizará la clave única en su lugar. Por ejemplo, las siguientes declaraciones son válidas, aunque la primera declaración ni siquiera especifica la clave de partición:

CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;

Conclusión

Para resumir, las particiones pueden ser útiles si tiene muchos datos, sus tablas son demasiado grandes para caber en la memoria o contienen datos históricos. Las particiones también pueden ser útiles si cree que necesitará distribuir el contenido de una tabla en diferentes medios de almacenamiento, también si desea tener la opción de eliminar o restaurar particiones individuales.

Sin embargo, tenga en cuenta que las particiones en MySQL tienen sus propias desventajas. Una de las principales desventajas de la partición es que hará que sus tablas sean más grandes:no puede ganar velocidad sin comprometer el espacio. Si tiene un conjunto de datos muy grande, esto puede ser un problema bastante grande.