Projet IDAPA

Accueil > Bases de données relationnelles et indexation du contenu > Rapport final

Rapport final

Rapport + Annexe + Références

vendredi 6 février 2009, par Yoann Moreau

Annexe – Les limites de MySQL

1. Les fonctions de MySQL utilisées

Le serveur utilisé est un Ubuntu Server 7.10 avec un noyau Linux de version 2.6.22-16-generic sur une plateforme x86-64 avec 4Go de mémoire vive.

Le serveur MySQL est de version 14.12 avec la distribution 5.0.45.
Pour la réalisation du moteur OLAP, nous utiliserons une table MyISAM, structure dérivant du principe ISAM (Indexed Sequential Access Method). Les colonnes d’id et d’attribut seront clés primaires de la table et indexées avec l’index MyISAM (un arbre B). L’indexation des valeurs (indexation fulltext) sera effectuée par un moteur externe à MySQL.

2. Les limites

2.1 Taille maximale d’une table

La taille d’une table en MYSQL est limitée à la taille d’un fichier. Sur le serveur (noyau 2.6 et filesystem en ext3) la taille d’un fichier maximale est 2To. Les tables MyISAM ont une limite à cause de pointeurs internes, il faut donc paramétrer la taille des pointeurs dés la création de la table ou modifier la table si elle existe déjà, ce paramètre peut être réglé pour supporter des tables de plus de 256To. La valeur de ce paramètre par défaut dépend de la version de MySQL et de la variable de MySQL « myisam_data_pointer_size », on peut donc ainsi éviter d’avoir à le spécifier à la création ou modification des tables.

2.2 Nombre maximum de lignes d’une table

Le nombre maximum de lignes (tuples) d’une table est 232 (4G), on peut modifier ce paramètre (avec un processeur 64bits uniquement) avec l’option de compilation –with-big-tables, qui double la taille des adresses et permet donc des tables de 264 lignes.

2.3 Taille d’un index MyISAM

On peut calculer la taille maximale d’un index MyISAM (arbre B) par la formule suivante : somme des ( (taille de la clé + 4) / 0.67 )

Cependant la taille des clés (qui sont les colonnes id et attribut) est variable et on ne peut pas la prévoir à l’avance. On peut borner la taille des clés à 256 octets et donc avoir une borne maximale de la taille de l’index selon le nombre de lignes avec cette formule : (516 / 0.67) * nombre de lignes

Soit environ 770 octets fois le nombre de lignes. Cette valeur n’est pas représentative car elle équivaut au pire des cas, les clés pouvant varier de quelques octets à 256 il est probable que la moyenne de leur taille soit très différente du maximum.

2.4 Partitions

Une table MySQL peut être divisée en plusieurs parties sur plusieurs partitions (fichier ou disque), cette répartition se fait au travers d’une fonction paramétrable qui peut être des intervalles de valeurs, ou du hashage. La répartition se fait au niveau des lignes (un groupe de lignes dans chaque partie) et ne peut pas se faire au niveau des colonnes (certaines colonnes dans chaque partie). Le partitionnement est autorisé avec l’option de compilation –with-partition. Le type de table doit être le même pour toutes les partitions d’une même tables mais le partitionnement est compatible avec tous les types de table. Le partitionnement s’applique autant aux données qu’au index et il est impossible de ne partitionner que l’un des deux. Il est possible de donner une taille minimum et maximum aux partitions, et le nombre maximum de partitions (sous partitions comprises) est de 1024 pour une table. Les tables partitionnées ne supportent pas l’indexation fulltext de MySQL. Les tables partitionnées ne supportent pas la gestion du cache des clés (pré-chargement en mémoire de blocs d’index etc). La clé de partition (colonne donnée) doit être un entier, il faut sinon transformer la colonne en valeur entière au travers d’une fonction.

Selon l’article de sqlplex (voir Références du rapport) l’utilisation d’index sur les clés primaires est inefficace pour de larges bases partitionnées.

2.5 Variables système utiles de MySQL

big_tables (booléen) : place les tables temporaires dans des fichiers pour éviter l’erreur « table pleine », mais cela baisse les performances pour des tables pouvant être contenues directement en mémoire.

key_buffer_size (entier) : taille maximum du cache des index pour les tables MyISAM, à partir de MySQL 5.0.52 cette valeur peut être supérieure à 4Go. Cette limite est appliquée à un seul bloc en cache, sachant qu’il est possible d’utiliser plusieurs cache d’index pour une même table. Si le cache est trop important, une partie sera sur disque, baissant les performances.

max_allowed_packet (entier) : taille maximum des paquets d’octets utilisés, la valeur devraient contenir la taille de la plus grande valeur TEXT ou BLOB des tables. Elle est par défaut à 1Mo et limitée à 1Go.

myisam_data_pointer_size (entier) : taille d’un pointeur en table MyISAM, la valeur doit être comprise entre 2 et 7, elle est à 6 pour une version supérieure à 5.0.6.

myisam_sort_buffer_size (entier) : taille du cache pour le tri d’index MyISAM, la valeur maximum est 4Go et vaut par défaut 8Mo.

myisam_max_sort_file_size (entier) : taille du fichier temporaire créé pour la génération d’index MyISAM, une taille insuffisante baisse les performances. Par défaut elle est de 2Go.