2010-09-20 44 views
6

¿Es posible realizar una partición basada en la columna char?Cómo particionar una tabla MySQL basada en la columna char?

Después de revisar la documentación de MySQL 5.1, parece que solo se pueden usar tipos enteros.

¿Es esto correcto? ¿O puedo usar alguna función para convertir el carácter en un número entero?

El campo de caracteres en cuestión contiene un identificador único.

Respuesta

15

El particionamiento en MySQL 5.1 solo puede tratar con columnas de enteros (Source). Solo puede usar few partitioning functions en columnas no enteras. Por ejemplo:

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) 
    ENGINE=INNODB 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 6; 

También puede utilizar key partitioning en MySQL 5.1, siempre y cuando la clave principal incluye todas las columnas en función de partición de la tabla:

CREATE TABLE k1 (
    id CHAR(3) NOT NULL PRIMARY KEY, 
    value int 
) 
PARTITION BY KEY(id) 
PARTITIONS 10; 

Por otro lado, en MySQL 5.5 , puede usar range column partitioning o list column partitioning en una amplia variedad de tipos de datos, incluidas las columnas basadas en caracteres.

Columnas de lista Ejemplo:

CREATE TABLE expenses (
    expense_date DATE NOT NULL, 
    category VARCHAR(30), 
    amount DECIMAL (10,3) 
); 

ALTER TABLE expenses 
PARTITION BY LIST COLUMNS (category) 
(
    PARTITION p01 VALUES IN ('lodging', 'food'), 
    PARTITION p02 VALUES IN ('flights', 'ground transportation'), 
    PARTITION p03 VALUES IN ('leisure', 'customer entertainment'), 
    PARTITION p04 VALUES IN ('communications'), 
    PARTITION p05 VALUES IN ('fees') 
); 

Rango Columnas Ejemplo:

CREATE TABLE range_test (
    code CHAR(3), 
    value INT 
) 
PARTITION BY RANGE COLUMNS(code) (
    PARTITION p0 VALUES LESS THAN ('MMM'), 
    PARTITION p1 VALUES LESS THAN ('ZZZ') 
); 

Más información:

+0

Gracias - Estaba buscando principalmente en HASH/LIST. –

0

¿Qué espera obtener mediante la partición? HASH y LIST no ofrecen ninguna ganancia de rendimiento. Rara vez es útil dividir una tabla con menos de un millón de filas.

Otros comentarios sobre la partición: http://mysql.rjweb.org/doc.php/partitionmaint

5,6 y 5,7 se han relajado alguna de las restricciones mención en las otras respuestas, pero todavía particionado es raramente mejor que la indexación.

Cuestiones relacionadas