Partitionnement MySQL : Optimiser les performances des tables

December 31, 2018

Avec le temps, de nombreuses tables MySQL deviennent volumineuses, ce qui rallonge les temps de recherche, même avec des index bien choisis. Une solution efficace à ce problème est le partitionnement.

Partitionnement MySQL : Qu’est-ce que c’est ?

Imaginez une bibliothèque avec toutes les informations dans un seul livre. Malgré un bon index, la recherche reste lente.

Si le livre est divisé en plusieurs tomes et que vous ne cherchez que dans un seul, l’index devient beaucoup plus rapide. Le partitionnement MySQL fonctionne de la même manière, mais pour les tables.

Cet article se concentre sur le partitionnement horizontal (par ligne).

Quand et comment appliquer le partitionnement à vos tables ?

Pour vérifier si le partitionnement est activé :

SHOW PLUGINS;

Vous devez voir “partition” avec le statut ACTIVE. Certaines tables ne peuvent pas être partitionnées :

Choisir la clé de partitionnement

La clé de partitionnement doit respecter ces conditions :

Types de Partitionnement MySQL

Partitionnement par Range

Les lignes sont réparties selon des zones définies. On ne peut pas utiliser directement de dates, mais des fonctions MySQL comme YEAR sont autorisées.

CREATE TABLE example (
  id INT NOT NULL
)
PARTITION BY RANGE (id) (
  PARTITION p0 VALUES LESS THAN (6),
  PARTITION p1 VALUES LESS THAN (11),
  PARTITION p2 VALUES LESS THAN (16),
  PARTITION p3 VALUES LESS THAN MAXVALUE
  );

Partitionnement par List

Les valeurs de la clé de partitionnement doivent correspondre à une des valeurs définies dans la liste. Si la valeur n’est présente dans aucune liste, alors l’insertion est perdue.

Il n’y a pas de valeur de catch !

Cette methode s’adapte bien pour des clefs fixes et bien définies.

CREATE TABLE example (
    id INT NOT NULL,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

Partitionnement par Hash

La valeur dans le HASH doit etre entière. On peut utiliser une fonction mysql mais pour une valeur précise la valeur de sortie doit être identique.

L’expression de la partition est calculée par valeurDuHash % nombreDePartitions.

CREATE TABLE example (
    id INT NOT NULL,
    example_date DATE NOT NULL DEFAULT '1970-01-01',
    store_id INT
)
PARTITION BY HASH(YEAR(example_date))
PARTITIONS 4;
);

Partitionnement par Key

La clef n’est pas obligatoirement numérique, key utilise une fonction de hash propre a mysql (basé sur password).

CREATE TABLE example (
    id INT NOT NULL PRIMARY KEY,
    store_id INT
)
PARTITION BY KEY()
PARTITIONS 4;
);

Partitionnement Linear

Le calcul de la partition se fait différemment via la fonction suivante :

    V = POWER(2, CEILING(LOG(2, num)))
    N = F(column_list) & (V - 1).

    While N >= num:
        Set V = CEIL(V / 2)
        Set N = N & (V - 1)
        

Ou :

Contrairement a ce que dit le nom la répartition n’est pas linéaire.

Pruning des partitions

Le pruning des partitions permet à MySQL d’ignorer certaines partitions lors de l’exécution d’une requête, réduisant ainsi le volume de données à traiter. Seulement les partitions utiles seront lues. Cela se traduit par un temps d’exécution plus rapide et une utilisation mémoire optimisée.

Actions sur les partitions

Optimisation des partitions

Lors suppression de ligne ou changement de taille des colonnes, il peut y avoir une fragmentation des données on peu alors lancer une optimisation par partition.

ALTER TABLE my_table_partitioned 
OPTIMIZE PARTITION partition_name_to_optimize;

Réparation des partitions

En cas d’erreur sur les données ou les index on peut reparer par partion

ALTER TABLE my_table_partitioned 
CHECK PARTITION p0,p1

Suppression de Partition

Grâce au partitionnement on peut supprimer des partitions directement. Ainsi la suppression d’un enregistrement par rapport a la date peut se faire rapidement même sur des gros volumes de données.

ALTER TABLE my_table_partitioned 
DROP PARTITION partition_name_to_drop;

Ajout de partition

On peut aussi ajouter des partitions

ALTER TABLE my_table_partitioned 
ADD PARTITION partition_name (PARTITION_DESCRIPTION);

Note : Sur du partitionnement par range on ne peut pas ajouter de participation apres notre partition fourre-tout (celle en MAXVALUE ). Il faudra dont la supprimer au préalable, puis ajouter la nouvelle et la recréer. Bien sûr, il faut faire cela avec quelle ne commence a se remplir.

Contraintes mémoires

Dans le cas des tables MyISAM, chaque partition utilise deux file descriptor qui doivent être ouvertes pour accéder aux données, et ceci est bien sûr par partition.

Voici un petit aperçu du partitionnement, de son utilisation pour augmenter les performances sur des tables assez volumineuse.

comments powered by Disqus