2010-09-20 2 views
6

Ist es möglich, basierend auf einer Char-Spalte zu partitionieren?Wie partitioniert man eine MySQL-Tabelle basierend auf der char-Spalte?

Nach Überprüfung der MySQL 5.1-Dokumentation scheint es, dass nur ganzzahlige Typen verwendet werden können.

Ist das korrekt? Oder kann ich eine Funktion verwenden, um das Zeichen in eine Ganzzahl umzuwandeln?

Das betreffende char-Feld enthält eine eindeutige Kennung.

Antwort

15

Partitionierung in MySQL 5.1 kann nur mit ganzzahligen Spalten (Source) umgehen. Sie können nur few partitioning functions für nicht ganzzahlige Spalten verwenden. Zum Beispiel:

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

Sie auch key partitioning in MySQL 5.1, solange der Primärschlüssel enthält alle Spalten in der Partitionierungsfunktion der Tabelle verwenden:

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

Auf der anderen Seite, in MySQL 5.5 Sie können range column partitioning oder list column partitioning für eine Vielzahl von Datentypen verwenden, einschließlich zeichenbasierter Spalten.

Liste Spalten Beispiel:

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

Bereich Spalten Beispiel:

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

Weiterführende Literatur:

+0

Danke - Ich schaute hauptsächlich auf HASH/LIST. –

0

Was erhoffen Sie sich von Partitionierungs zu gewinnen? HASH und LIST werden wahrscheinlich keinen Leistungsgewinn bringen. Es ist selten sinnvoll, eine Tabelle mit weniger als einer Million Zeilen zu partitionieren.

Kommentare zur Partitionierung: http://mysql.rjweb.org/doc.php/partitionmaint

5.6 und 5.7 haben entspannt einige der Beschränkungen in den anderen Antworten erwähnt, aber immer noch die Partitionierung ist selten besser als Indizierung.

Verwandte Themen