Dans cet article de blog, nous allons discuter de l'une des fonctionnalités les plus utilisées de MySQL :les partitions.
Qu'est-ce que le partitionnement ?
Dans MySQL, le partitionnement est une technique de conception de base de données dans laquelle une base de données divise les données en plusieurs tables, mais traite toujours les données comme une seule table par la couche SQL. En termes simples, lorsque vous partitionnez une table, vous la divisez en plusieurs sous-tables :le partitionnement est utilisé car il améliore les performances de certaines requêtes en leur permettant d'accéder uniquement à une partie des données, ce qui les rend plus rapides. Les opérations d'E/S peuvent également être améliorées car les données et les index peuvent être répartis sur plusieurs volumes de disque.
Il existe deux types de partitionnement :horizontal et vertical. Le partitionnement horizontal consiste à placer différentes lignes dans différentes tables, tandis que le partitionnement vertical consiste à créer des tables avec moins de colonnes et à utiliser des tables supplémentaires pour stocker les colonnes restantes.
Comment fonctionne le partitionnement ?
- Lorsque des requêtes SELECT sont utilisées, la couche de partitionnement ouvre et verrouille les partitions, l'optimiseur de requête détermine si l'une des partitions peut être élaguée, puis la couche de partitionnement transmet les appels d'API du gestionnaire au moteur de stockage qui gère les partitions.
- Lorsque des requêtes INSERT sont utilisées, la couche de partitionnement ouvre et verrouille les partitions, détermine à quelle partition la ligne doit appartenir, puis transmet la ligne à cette partition.
- Lorsque des requêtes DELETE sont utilisées, la couche de partitionnement ouvre et verrouille les partitions, détermine quelle partition contient la ligne, puis supprime la ligne de cette partition.
- Lorsque des requêtes UPDATE sont utilisées, la couche de partitionnement ouvre et verrouille les partitions, détermine quelle partition contient la ligne, récupère la ligne et la modifie, puis détermine quelle partition doit contenir la nouvelle ligne, transmet la ligne à la nouvelle partition avec une demande d'insertion, puis transmet la demande de suppression à la partition d'origine.
Quand devez-vous utiliser le partitionnement ?
En général, le partitionnement est utile lorsque :
- Vous avez beaucoup de données à interroger.
- Vos tableaux sont trop volumineux pour tenir en mémoire.
- Vos tables contiennent des données historiques et de nouvelles données sont ajoutées dans la partition la plus récente.
- Vous pensez que vous devrez répartir le contenu d'une table sur différents périphériques de stockage.
- Vous pensez devoir restaurer des partitions individuelles.
Si un ou plusieurs des scénarios décrits ci-dessus décrivent votre situation, le partitionnement peut vous aider. Avant de partitionner vos données, n'oubliez pas que les partitions MySQL ont leurs propres limites :
- Les expressions de partitionnement n'autorisent pas l'utilisation de procédures stockées, de fonctions stockées, de fonctions définies par l'utilisateur (UDF) ou de plugins, et avec une prise en charge limitée des fonctions SQL. Vous ne pouvez pas non plus utiliser de variables déclarées ou stockées.
- Les tables partitionnées ne peuvent pas contenir ou être référencées par des clés étrangères.
- Il y a une limite de 1 024 partitions par table (à partir de MariaDB 10.0.4, les tables peuvent contenir un maximum de 8 192 partitions).
- Une table ne peut être partitionnée que si le moteur de stockage prend en charge le partitionnement.
- Le cache de requêtes n'est pas conscient du partitionnement ou de l'élagage des partitions.
- Toutes les partitions doivent utiliser le même moteur de stockage.
- Les index FullTEXT ne sont pas pris en charge
- Les tables temporaires ne peuvent pas être partitionnées
Les options ci-dessus devraient vous aider à décider si le partitionnement est une option pour vous ou non.
Types de partitionnement
Si vous décidez d'utiliser des partitions, gardez à l'esprit que vous avez le choix entre plusieurs types de partitionnement. Nous allons brièvement couvrir vos options ci-dessous, puis les approfondir :
- Le partitionnement par RANGE peut vous aider à partitionner les lignes en fonction des valeurs de colonne comprises dans une plage donnée.
- Le partitionnement par LIST peut vous aider à partitionner les lignes en fonction de l'appartenance des valeurs de colonne dans une liste donnée.
- Le partitionnement par HASH peut vous aider à partitionner des lignes en fonction d'une valeur renvoyée par une expression définie par l'utilisateur.
- Le partitionnement par KEY peut vous aider à partitionner les lignes en fonction d'une fonction de hachage fournie par MySQL.
Partitionnement par RANGE
Le partitionnement par RANGE est l'une des formes les plus populaires de partitionnement des tables MySQL. Lorsque vous partitionnez une table par RANGE, vous partitionnez la table de manière à ce que chaque partition contienne un certain nombre de lignes comprises dans une plage donnée. Pour définir une partition, définissez son nom, puis indiquez-lui les valeurs qu'elle doit contenir - pour partitionner une table par plage, ajoutez une instruction PARTITION BY RANGE. Par exemple, si vous souhaitez nommer votre partition p0 et lui faire contenir toutes les valeurs inférieures à 5, vous devez vous assurer que votre requête contient PARTITION p0 VALUES MOINS DE (5). Voici un exemple de table partitionnée :
CREATE TABLE sample_table (
id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,
column_name VARCHAR(255) NOT NULL DEFAULT ‘’
...
) PARTITION BY RANGE (column_name) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20),
...
);
Vous pouvez également définir une partition qui contient toutes les valeurs qui ne tombent pas dans certaines plages comme ceci :
PARTITION p5 VALUES LESS THAN MAXVALUE
La partition ci-dessus est nommée p5 et elle contient toutes les valeurs que les autres partitions n'ont pas - MAXVALUE représente une valeur qui est toujours supérieure à la plus grande valeur possible. Vous pouvez également utiliser des fonctions en définissant vos partitions comme suit :
PARTITION BY RANGE (YEAR(date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
Dans ce cas, toutes les valeurs inférieures à 2000 sont stockées dans la partition p0, toutes les valeurs inférieures à 2010 sont stockées dans la partition p1, toutes les valeurs inférieures à 2020 sont stockées dans la partition p2 et toutes les valeurs qui n'appartiennent à aucune de ces plages sont stockées dans la partition p3.
Partitionnement par LIST
Le partitionnement des tables MySQL par LIST est similaire au partitionnement par RANGE - la principale différence du partitionnement des tables par LIST est que lorsque les tables sont partitionnées par LIST, chaque partition est définie et sélectionnée en fonction de l'appartenance à une valeur de colonne dans un ensemble de listes de valeurs plutôt qu'une plage de valeurs. Le partitionnement par LIST peut être utile lorsque vous savez que, par exemple, vous disposez de données pouvant être divisées en plusieurs ensembles de données plus petits (par exemple, des régions). Supposons que vous ayez un magasin qui compte 4 franchises :une dans le centre-ville, la deuxième au nord, la troisième à l'est, la quatrième à l'ouest. Vous pouvez partitionner une table de manière à ce que les données appartenant à une certaine franchise soient stockées dans une partition dédiée à cette franchise :
PARTITION BY LIST(store) (
PARTITION central VALUES IN (1,3,5),
PARTITION north VALUES IN (2,4,7),
PARTITION east VALUES IN (8,9),
PARTITION west VALUES IN (10,11)
);
Partitionnement par HASH
Le partitionnement des tables MySQL par HASH peut être un moyen de s'assurer que les données entre les partitions sont réparties uniformément. Si vous partitionnez vos tables par HASH, il vous suffit de spécifier le nombre de partitions dans lesquelles vos données doivent être divisées - le reste est pris en charge par MySQL. Vous pouvez utiliser le partitionnement par HASH en ajoutant l'instruction suivante à CREATE TABLE :
PARTITION BY HASH(id)
PARTITIONS 5;
Remplacez 5 par le nombre qui spécifie en combien de partitions vos données doivent être divisées - le nombre par défaut est 1.
MySQL prend également en charge le partitionnement par LINEAR HASH - le hachage linéaire diffère du hachage régulier car le hachage linéaire utilise un algorithme linéaire de puissances de deux. Pour partitionner les tables par un HASH LINÉAIRE, remplacez PARTITION BY HASH par PARTITION BY HASH LINÉAIRE.
Partitionnement par KEY
Le partitionnement des tables MySQL par KEY est similaire au partitionnement des tables MySQL par HASH - dans ce cas, la fonction de hachage pour le partitionnement par clé est fournie par le serveur MySQL. Toutes les colonnes utilisées comme clé de partitionnement doivent comprendre la clé primaire de la table entière ou au moins faire partie de la clé primaire de la table. Si aucun nom de colonne n'est spécifié comme clé de partitionnement, la clé primaire sera utilisée. S'il n'y a pas de clé primaire, mais qu'il existe une clé unique, la clé unique sera utilisée à la place. Par exemple, les instructions suivantes sont toutes deux valides, même si la première instruction ne spécifie même pas la clé de partitionnement :
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;
Conclusion
Pour résumer, les partitions peuvent être utiles si vous avez beaucoup de données, si vos tables sont trop grandes pour tenir en mémoire ou si elles contiennent des données historiques. Les partitions peuvent également être utiles si vous pensez que vous devrez répartir le contenu d'une table sur différents supports de stockage, également si vous souhaitez avoir la possibilité de supprimer ou de restaurer des partitions individuelles.
Cependant, gardez à l'esprit que les partitions dans MySQL ont leurs propres inconvénients. L'un des principaux inconvénients du partitionnement est qu'il agrandira vos tables - vous ne pouvez pas gagner en vitesse sans compromettre l'espace. Si vous avez un très grand ensemble de données, cela peut être un gros problème.