| 7.5 Optimiser le serveur MySQL
 7 Optimisation de MySQL
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Réglage du système, au moment de la compilation, et paramètres du démarrage
 . Réglage des paramètres du serveur
 . Contrôle des performances de l'optimisateur de requêtes
 . Influences de la compilation et des liaisons sur la vitesse de MySQL
 ->Comment MySQL gère la mémoire
 . Comment MySQL utilise le DNS
 
 
 | 
  7.5.5 Comment MySQL gère la mémoire  
 
La liste suivante indique certaines techniques utilisées par le serveur 
 
mysqld
  pour gérer la mémoire. Lorsque c'est possible, la variable
serveur liée à la mémoire est indiquée :
 
Le buffer de clés (variable  
key_buffer_size
 ) est partagé par
tous les threads. Les autres buffers sont sont alloués par le serveur
suivant les besoins.  Choix des paramètres du serveur .
Chaque connexion utilise un espace spécifique au thread : 
 
Le buffer de connexion et celui de
résultat sont dynamiquement élargit jusqu'à  
max_allowed_packet
  suivant
les besoins. Lorsque la requête s'exécute, une copie de la chaîne de requête
est aussi allouée.
une pile (par défaut, 64 ko, variable  
thread_stack
 ), 
un buffer de connexion (variable  
net_buffer_length
 ),
un buffer de résultat  (variable  
net_buffer_length
 ). 
Tous les threads partagent la même mémoire de base.
Seules les tables compressées  
ISAM
  /  
MyISAM
  sont copiées en
mémoire. Ceci est dû au fait que pour un espace de 32 bits, il n'y a pas
de place pour les grosses tables en mémoire. Lorsque les systèmes de 
64 bits seront plus répandus, nous pourrions généraliser le support pour 
la copie en mémoire.
Chaque requête qui effectue une analyse séquentielle d'une table, alloue
un buffer de lecture (variable  
record_buffer
 ).
Lors de la lecture de lignes en ordre 'aléatoire'  (par exemple, après un
tri), un buffer de lecture aléatoire est allouée pour éviter les accès
disques (variable  
record_rnd_buffer
 ).
Toutes les jointures sont faîtes en une seule passe, et la plupart des
jointure sont faîtes sans utiliser de table temporaire. La plupart des
table temporaires sont faîtes en mémoire (table  
HEAP
 ). Les tables
temporaires avec beaucoup de données (calculées comme la somme des
tailles de toutes les colonnes) ou qui contiennent des colonnes de type
 
BLOB
  sont sauvées sur le disque.Un problème avec les versions de MySQL antérieures à la version 3.23.2 est que si
une table  
HEAP
  dépassait la taille maximale de  
tmp_table_size
 , 
vous obteniez une erreur  
The table tbl_name is full
 . Dans les nouvelles versions,
ce problème est géré en passant automatiquement la table  
HEAP
  en une
table  
MyISAM
  sur le disque. Pour contourner ce problème,
vous pouvez augmenter la taille maximale des tables en mémoire en modifiant l'option
 
tmp_table_size
  de  
mysqld
 , ou en modifiant l'option SQL 
 
BIG_TABLES
  dans le programme client.  Syntaxe de 
SET
 . 
En MySQL version 3.20, la taille maximale de la table temporaire est 
 
record_buffer*16
 , ce qui fait que si vous utilisez cette version,
vous aurez à augmenter la valeur de  
record_buffer
 . Vous pouvez aussi démarrer
 
mysqld
  avec l'option  
--big-tables
  pour toujours stocker les
tables temporaires sur le disque. Cependant, cela va affecter la vitesse
de votre serveur pour les requêtes complexes.
La plupart des requêtes qui sont triées allouent un buffer de tri,
et entre 0 et 2 fichiers temporaires, suivant la taille du résultat.
 Où MySQL conserve les fichiers temporaires .
Toute l'analyse et les calculs sont faits en mémoire locale. Aucune mémoire
supplémentaire n'est nécessaire pour les petits calculs, et les allocations
et libérations de mémoire sont évités. La mémoire n'est allouée que pour
les chaînes très grandes (ceci se fait via  
malloc()
  et
 
free()
 ).
Chaque fichier d'index est ouvert une fois, et le fichier de données est
ouvert pour chaque thread concurrent. Pour chaque thread concurrent, une structure
de table, une structure de colonne pour chaque colonne et un buffer de taille
 
3 * n
  est alloué (où  
n
  est la taille maximale de ligne, 
en dehors des colonnes de type  
BLOB
 ). Une colonne de type  
BLOB
  
utilise 5 à 8 octets de plus que la taille des données du  
BLOB
 .
Les gestionnaires de table  
ISAM
 / 
MyISAM
  utilisent un buffer d'une ligne
de plus pour leur utilisation interne.
Pour chaque table qui a une colonne  
BLOB
 , un buffer est dynamiquement
agrandi pour lire les valeurs  
BLOB
 . Si vous analysez toute une table,
un buffer aussi grand que la plus grande valeur de la colonne  
BLOB
  sera
alloué. 
Les gestionnaires de tables pour les tables en cours d'utilisation sont sauvées 
dans un cache, et géré comme une pile FIFO. Normalement, ce cache contient 64 
lignes. Si une table doit être utilisée par deux threads concurrents 
simultanément, le cache contiendra deux entrées pour la table.  Comment MySQL ouvre et ferme les tables .
La commande  
mysqladmin flush-tables
  ferme toute les tables qui ne sont
pas utilisées, et marque toutes les tables en cours d'utilisation pour qu'elles
soient fermées dès la fin du thread. Cela va libérer l'essentiel de la mémoire
utilisée.
 
ps
  et d'autres commandes de statut système peuvent indiquer que 
 
mysqld
  utilise beaucoup de mémoire. Ceci est peut être dû a des
erreurs de comptabilité. Par exemple, sous Solaris,  
ps
  compte
la mémoire inutilisée entre les threads comme de la mémoire utilisée.
Vous pouvez le vérifier en regardant l'état de la swap avec 
 
swap -s
 . Nous avons testé  
mysqld
  avec les détecteurs de 
fuite mémoire commerciaux, et il n'y a aucune fuite.
 |