Anuncios

Bienvenidos sean a este post, hablemos sobre uno de los tipos de particion.

Anuncios
Anuncios

Este es muy similar al que vimos en el post anterior pero en este caso en lugar de asignar un rango de valores a cada particion asigna una lista de valores, cada particion debe tener al menos un valor asignado, el orden de las particiones no es relevante para este tipo, todos los valores deben ser explicitamente nombres, no hay forma de poner los valores no mencionados dentro de una particion, lo cual es muy similar a MAXVALUE del tipo RANGE que vimos en el post anterior, cuando se intenta ingresar un valor que no esta en la particion nos devolvera el siguiente error:

Error (Code 1526): Table has no partition for value 100
Anuncios

Vamos a tomar el ejemplo que vimos en el post anterior pero en lugar de particionarlo con RANGE lo haremos con LIST:

CREATE TABLE article (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  date DATE NOT NULL,
  author VARCHAR(100),
  language TINYINT UNSIGNED,
  text TEXT,
  PRIMARY KEY (id, language)
)
  ENGINE = InnoDB
PARTITION BY LIST (language) (
  PARTITION p0 VALUES IN (1),
  PARTITION p1 VALUES IN (2, 3),
  PARTITION p2 VALUES IN (4, 5, 6, 7, 8, 9, 10, 11),
  PARTITION px VALUES IN (NULL)
);
Anuncios
Anuncios

En este codigo language actua como una clave externa para una tabla que almacena informacion sobre idiomas (muy probablemente un id incremental y un nombre que lo representa) y la razon por la que no fue declarada como clave externa es porque las tablas particionadas no soportan claves externas, tal como mencionamos en este post, en este caso la expresion de particionamiento es un nombre de columna simple, en este caso funciona porque el valor de la columna language es de tipo entera (INTEGER) que solo contiene valores positivos, tambien podemos usar una columna CHAR para almacenar el codigo ISO del idioma, sin embargo en este caso deberia traducir este valor de cadena (STRING) en uno de numero.

Anuncios

Mas alla de que la columna language sea un entero, los valores no se pueden ordenar segun la logica, por lo tanto dividirlo entre rangos no tiene sentido, hay muchas razones por la cual utilizar un particionado de tipo LIST basado en la columna language puede ser una buena eleccion:

Anuncios
  • Los queries usuales probablemente muestren articulos en los idiomas seleccionados por lo tanto particionarlo de esta forma hara que los queries trabajen con una sola tabla
  • Puede haber un query que encuentre los idiomas que un articulo solicitado este disponible, este query debe ser bastante rapido asi que no nos importa que acceda a todas las particiones
  • Si un idioma es la porcion mas grande de los almacenados con esta particion podemos hacer que este dedicado en una sola particion, otras particiones pueden agrupar muchos idiomas donde una porcion mas pequeña del contenido esta disponible
  • Dependiendo de nuestra audiencia es posible que al menos dos particiones tengan la mayor frecuencia de lecturas, esto puede ser muy poco probable si utilizamos una particion por rango de fechas como vimos en el post anterior, por lo tanto particionando por idioma nos permite dividir las particiones mas accedidas en diferentes discos, esta tecnica sera explicada mas adelante
  • Si el contenido del idioma crece drasticamente es facil mover ese idioma a otra particion
Anuncios

En resumen, hoy hemos visto el tipo LIST, que es, como trabaja, como se implementa, sus similitudes y diferencias con RANGE, como podemos usarlo con un ejemplo similar al visto al post anterior, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50

Anuncio publicitario