2010-09-20 15 views
6

Est-il possible de partitionner en fonction de la colonne char? Après avoir examiné la documentation MySQL 5.1, il apparaît que seuls les types entiers peuvent être utilisés.Comment partitionner une table MySQL en fonction de la colonne char?

Est-ce correct? Ou puis-je utiliser une fonction pour convertir le caractère en entier?

Le champ char en question contient un identifiant unique.

Répondre

15

Le partitionnement dans MySQL 5.1 ne peut traiter qu'avec des colonnes entières (Source). Vous pouvez uniquement utiliser un few partitioning functions sur des colonnes non entières. Par exemple:

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

Vous pouvez également utiliser key partitioning dans MySQL 5.1, aussi longtemps que la clé primaire comprend toutes les colonnes de la fonction de partitionnement de la table:

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

D'autre part, dans MySQL 5.5 , vous pouvez utiliser range column partitioning ou list column partitioning sur une grande variété de types de données, y compris les colonnes basées sur des caractères.

Liste Colonnes Exemple:

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') 
); 

Colonnes Gamme Exemple:

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') 
); 

Pour en savoir plus:

+0

Merci - Je regardais principalement à HASH/LIST. –

0

Qu'est-ce que vous espérez gagner PARTITIONNEMENT? HASH et LIST sont peu susceptibles de fournir un gain de performance. Il est rarement utile de partitionner une table avec moins d'un million de lignes.

Autres commentaires sur le partitionnement: http://mysql.rjweb.org/doc.php/partitionmaint

5,6 et 5,7 ont assoupli certaines des restrictions mention dans les autres réponses, mais le partitionnement est rarement mieux que l'indexation.