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. See
            Section 7.5.2, « Réglage des paramètres du serveur ».
          
Chaque connexion utilise un espace spécifique au thread :
                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).
              
            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. See
            Section 13.5.2.8, « 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. See Section A.4.4, « Où MySQL stocke 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. See Section 7.4.8, « Quand 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.
      
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

