paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

MySQL - Subpartition

Con questo terzo articolo la panoramica sul partizionamento in MySQL e' quasi completa, considerando altre modalita' di partizionamento, come quello per colonna, presente dalla versione 5.5 di MySQL che per il momento non trattero' nei dettagli, perche' credo sufficiente la conoscenza dei concetti di base delle metodologie per partizionare i dati qui, ed in precedenza, illustrate.

Dalla versione 5.1 e' possibile applicare subpartition (chiamata anche "composite partition") che, come dice lo stesso nome, permette di dividere ulteriormente in partizioni una tabella già partizionata.
E' possibile definire subpartition, che devono essere solo di tipo HASH o KEY, su tabelle che sono partizionate per RANGE o per LIST.
Questo l'esempio di base:

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) )
    SUBPARTITIONS 2 (
        PARTITION p0 VALUES LESS THAN (1990),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE
    );

La tabella ts presenta 3 range partition per anno (dati minori del 1990, tra il 1990 e il 2000 e maggiori del 2000) ed ogni partizione e' a sua volta suddivisa in altre due, per un totale di 3*2 partizioni.
E' possibile anche definire i nomi delle subpartition, nel seguente modo, dove ogni partizione deve avere lo stesso numero di subpartition, altrimenti genera errore.

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );

Nel caso di tabelle con grandi mole di dati, MySQL permette di distribuire ogni subpartition su vari dischi, sia per i dati che per gli indici. Come potete immaginare questo facilita' e rendere piu' veloce l'accesso ai dati.
La sintassi e' la seguente:

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0
                DATA DIRECTORY = '/disk0/data'
                INDEX DIRECTORY = '/disk0/idx',
            SUBPARTITION s1
                DATA DIRECTORY = '/disk1/data'
                INDEX DIRECTORY = '/disk1/idx'
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2
                DATA DIRECTORY = '/disk2/data'
                INDEX DIRECTORY = '/disk2/idx',
            SUBPARTITION s3
                DATA DIRECTORY = '/disk3/data'
                INDEX DIRECTORY = '/disk3/idx'
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4
                DATA DIRECTORY = '/disk4/data'
                INDEX DIRECTORY = '/disk4/idx',
            SUBPARTITION s5
                DATA DIRECTORY = '/disk5/data'
                INDEX DIRECTORY = '/disk5/idx'
        )
    );

Come sempre, per maggiori dettagli e vi rimando al link della documentazione ufficiale.