10.2 Comment MySQL gère la mémoire

La liste suivante indique la manière dont mysqld utilise 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 (variable net_buffer_length), et un buffer de résultat (variable net_buffer_length). Les buffers de connexion et de résultat sont dynamiquement aggrandi jusqu'à la taille maximale de max_allowed_packet selon 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 BLOB sont stockées sur le disque. Un des problèmes récurent est que si une table stockées en HEAP dépasse la taille de tmp_table_size, vous obtener une erreur de type The 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'option tmp_table_size ou avec l'option SQL SQL_BIG_TABLES dans le programme client. SET OPTION. Avec MySQL 3.20, la taille maximum des tables temporaires était record_buffer*16, donc, si vous utilisez cette version, vous devez augmenter la valeur de record_buffer. Vous pouvez aussi démarrer mysqld avec l'option --big-tables pour 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 n la taille maximum d'une ligne, hormis les BLOB ). Un objet BLOB ustilise 5 à 8 octets plus la taille des données de l'objet BLOB.
  • Pour chaque table avec des colonnes BLOB, un buffer est automatiquement aggrandi pour pouvoir lire les grands objets BLOB. Si vous scannez une table, un buffer aussi grand que le plus grand des objets BLOB sera 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-tables ferme 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 mysqld utilise beaucoup de mémoire. Cela peut être du à de nombreuses piles, dans différents threads, à différentes adresses. Par exemple, la version Solaris de ps compte 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é mysqld avec des détecteurs de fuite de mémoire du commerce, et il n'y a plus de fuites de mémoire.