5.4 Optimisation de la structure de la base de données
5 Optimisation de MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Conception . Rendre vos tables aussi compactes que possible . Comment MySQL utilise les index . Index de colonnes . Index sur plusieurs colonnes . Pourquoi tant de tables ouvertes ? ->Quand MySQL ouvre et ferme les tables . Inconvénients de la création d'un grand nombre de tables dans la même base de données
|
5.4.7 Quand MySQL ouvre et ferme les tables
table_cache
,
max_connections
et
max_tmp_tables
affectent le nombre maximum de tables que le serveur garde ouvertes.
Si vous augmentez l'une de ces valeurs, vous pourriez rencontrer une
des limites de votre système d'exploitation. Cependant, vous pourrez
augmenter ces limites sur de nombreux systèmes d'exploitation. Consultez
votre documentation système pour voir comment faire cela, car la
méthode pour modifier la limite est différente pour chaque système.
table_cache
est lié au
max_connections
. Par exemple,
pour 200 connexions simultanées, vous devriez avoir un cache de table
d'environ
200 * n
, où
n
est le nombre maximum de table dans
une jointure. Vous devez aussi réserver des pointeurs de fichiers supplémentaires
pour les tables temporaires et les fichiers.
Assurez vous que votre système d'exploitation peut gérer le nombre
de pointeurs de fichiers demandé par l'option
table_cache
. Si
table_cache
est trop grand, MySQL peut être à court de pointeurs,
et refuser des connexions, échouer à l'exécution de requêtes, ou être
très instable. Vous devez aussi prendre en compte que les tables
MyISAM
peuvent avoir besoin de deux pointeurs de fichiers pour chaque
table différente. Vous pouvez augmenter le nombre de pointeurs de fichiers
disponibles pour MySQL avec l'option de démarrage
--open-files-limit=#
.
Fichier non trouvé .
Le cache de tables ouvertes reste au niveau de
table_cache
entrées (par défaut, 64; cela peut être modifié avec l'option
-O table_cache=#
de
mysqld
). Notez que MySQL peut
ouvrir temporairement plus de tables, pour être capable d'exécuter
des requêtes.
Une table qui n'est pas utilisée est refermée, et supprimée du cache de table,
dans les circonstances suivantes :
-
Lorsque le cache est plein, et qu'un thread essaie d'ouvrir une table qui
n'est pas dans le cache.
-
Lorsque le cache contient plus de
table_cache
lignes, et qu'aucun
thread n'utilise cette table.
-
Lorsque quelqu'un utilise la commande
mysqladmin refresh
ou
mysqladmin flush-tables
.
-
Lorsque quelqu'un exécute la commande
FLUSH TABLES
.
Lorsque le cache de table se remplit, le serveur utilise la procédure
suivante pour identifier une entrée du cache, pour la supprimer :
-
Les tables qui n'est pas en cours d'utilisation est libérée, en utilisant
la table qui a été accédé depuis plus longtemps en premier.
-
Si le cache est plein, et qu'aucune table ne peut être libérée, mais qu'une nouvelle
table doit être ouverte, le cache est temporairement étendu.
-
Si le cache est dans un état d'extension, et qu'une table passe de l'état d'utilisation
à non utilisation, la table est immédiatement fermée et libérée du cache.
Une table est ouverte pour chaque accès simultané. Cela signifie que si vous
avez deux threads qui accèdent à la même table, ou accèdent à la même
table deux fois dans la requête (avec
AS
), la table devra être ouverte
deux fois. La première ouverture d'une table prendre deux pointeurs de
fichiers. Chaque utilisation supplémentaire de la même table ne prendra
qu'un pointeur supplémentaire. Le pointeur de fichier supplémentaire de la
première table est celui du fichier d'index. Ce pointeur est partagé entre
les threads.Si vous ouvrez une table avec
HANDLER table_name OPEN
, un objet
de table dédié sera alloué pour le thread. Cet objet de table n'est pas partagé
avec les autres threads, et il ne sera pas fermé avant que le thread
n'appelle
HANDLER table_name CLOSE
, ou que le thread ne meurt.
Syntaxe des
HANDLER
. Lorsque cela arrive, la table est
placée dans le cache de table (si il n'est pas plein).
Vous pouvez vérifier si votre cache de table n'est pas trop petit en vérifiant
la variable de
mysqld
appelée
Opened_tables
. Si cette valeur est grande,
même si vous n'avez pas trop abusé de la commande
FLUSH TABLES
, vous devrez
augmenter la taille du cache.
SHOW STATUS
.
|