|  |  
 
La liste suivante indique la manière dont mysqldutilise la mémoire. A chaque fois que c'est possible, le nom des variables systèmes adéquates sont cités. 
Le buffer de clé (variable key_buffer) est partagée par tous les threads; Les autres buffers sont alloués selon les nécessités.Chaque connexion utilise un thread particulier, une pile (64K, variable thread_stack) ; un buffer de connexion (variablenet_buffer_length), et un buffer de résultat (variablenet_buffer_length). Les buffers de connexion et de résultat sont dynamiquement aggrandi jusqu'à la taille maximale demax_allowed_packetselon les besoins. Quand une requête est en cours d'exécution, une copie de la chaîne de requête est aussi allouée.Tous les threads se partage la mémoire de base.
Hormis les tables compressées, rien n'est mappé en mémoire actuellement. Cela provient du fiat que les adresse de 32bits, soit 4 Go ne sont pas assez grand pour la plus part des très grande tables. Dès qu'un système d'exploitation avec des adresses de 64-bit sera disponible, nous pourrons ajouter le mappage mémoire.
Chaque requête qui fait une recherche séquentielle créer un buffer de lecture (variable record_buffer).Tous les regroupements sont fait en une seule passe, et la plus part des regroupements peut être fait sans avoir recours à une table temporaire. La plus part des tables temporaires sont gardée en mémoire vive (HEAP). Les tables temporaires avec des enregistrements de grandes tailles (calculées avec la somme des longueurs de colonnes) ou qui contiennent des objets de type BLOBsont stockées sur le disque. Un des problèmes récurent est que si une table stockées en HEAP dépasse la taille detmp_table_size, vous obtener une erreur de typeThe table nom_table is full. Dans les prochaines versions, les tables temporaires sauvées en mémoire seront automatiquement transférées sur le disque. Pour contourner le problème, vous pouvez augmenter le nombre de tables temporaires avec l'optiontmp_table_sizeou avec l'option SQLSQL_BIG_TABLESdans le programme client.SET OPTION. Avec MySQL 3.20, la taille maximum des tables temporaires étaitrecord_buffer*16, donc, si vous utilisez cette version, vous devez augmenter la valeur derecord_buffer. Vous pouvez aussi démarrermysqldavec l'option--big-tablespour forcer le stockarge des tables temporaires sur le disque. Cependant, cela va affecter les performances des requêtes compliquées.La plus part des requêtes qui font un tri, alloue un buffer de tri, et un ou deux fichiers temporaires.   18.5  Où MySQL enregistre les fichiers temporaires.
Toutes les analyses et les calculs sont fait en mémoire vive. Aucune mémoire supplémentaire n'est nécessaire pour les petits objets, et les problèmes d'allocations et dedésallocation de mémoire lente sont évités. On utilise alors ces méthodes uniquement pour les chaînes les plus longues.
Chaque fichier d'index est ouvert une fois, et chaque fichier de données est ouvert par chaque thread concurent. Pour chacun des threads, une table de structure (colonnes et structure de chaque colonne) et un buffer de 3 * n est alloué, avec nla taille maximum d'une ligne, hormis lesBLOB). Un objetBLOBustilise 5 à 8 octets plus la taille des données de l'objetBLOB.Pour chaque table avec des colonnes BLOB, un buffer est automatiquement aggrandi pour pouvoir lire les grands objetsBLOB. Si vous scannez une table, un buffer aussi grand que le plus grand des objetsBLOBsera alloué.Les handlers de table pour les tables couramment ouvertes sont sauvés dans un cache, et géré comme une pile de type FIFO. Généralement, ce cache a 64 entrées. Si une table a été utilisée par deux threads concurents en même temps, le cache contient deux fois la table.
  10.8  Comment MySQL ouvre et ferme les tables.
Une commande mysqladmin flush-tablesferme toutes les tables qui ne sont pas en cours d'utilisation, et s'assure que toutes les tables ouvertes seront aussitôt refermées dès que le thread qui les utilisent auront terminé. Cela permettra de libérer l'essentiel de la mémoire. 
ps et d'autres programmes rapportent parfois que mysqldutilise beaucoup de mémoire. Cela peut être du à de nombreuses piles, dans différents threads, à différentes adresses. Par exemple, la version Solaris depscompte la mémoire inutilisée entre les piles comme de la mémoire utilisée. Vous pouvez vérifier ceci en vérifiant le swap disponible, avec :swap -s. Nous avons testémysqldavec des détecteurs de fuite de mémoire du commerce, et il n'y a plus de fuites de mémoire. |