Services webmasters
Partenaires
Jeux concours gratuits
 
Influences de la compilation et des liaisons sur la vitesse de MySQL
<<<
Comment MySQL gère la mémoire Comment MySQL utilise le DNS
>>>

5.5 Optimisation du serveur MySQL
5 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
Influences de la compilation et des liaisons sur la vitesse de MySQL
->Comment MySQL gère la mémoire
Comment MySQL utilise le DNS
Syntaxe de SET

5.5.4 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 : une pile (par défaut, 64ko, variable thread_stack ), un buffer de connexion (variable net_buffer_length ) et un buffer de résultat (variable net_buffer_length ). 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.
  • 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.

<< Comment MySQL gère la mémoire >>
Influences de la compilation et des liaisons sur la vitesse de MySQL Optimisation du serveur MySQL Comment MySQL utilise le DNS
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -