Optimisation du moteur MySQL

Á partir de MySQL 5.1, la variable max_allowed_packet est devenue une commande globale qui peut se paramétrer sans redémarrer MySQL. Il suffit de se connecter en console MySQL et de taper la commande :
SET GLOBAL max_allowed_packet=16*1024*1024;

Afin de paramétrer au mieux le moteur de bases de données MySQL, il est possible de modifier manuellement le fichier my.cnf situé dans le répertoire où est installé MySQL (généralement c:\mysql) ou bien en utilisant les outils d'administrations de MySQL ; cette dernière solution est bien préférable et c'est elle que nous allons décrire en premier.

MySQL Administrator

Installation

L'outil d'administration MySQL Workbench fourni par MySQL peut être téléchargé gratuitement sur le site mysql.com (cliquer sur le lien pour la proposition "Windows (x86)"). Il vous sera proposé de vous "enregistrer", mais vous pouvez sauter cette étape en choisissant le lien "No thanks, just take me to the downloads!".
L'outil MySQL administrator, plus ancien mais plus léger peut être téléchargé ici.

Après installation, vous pourrez lancer MySQL Administrator en allant dans le menu démarrer puis Tous les programmes puis MySQL puis MySQL Administrator.

L'outil de configuration se lance sur une fenêtre qui permet de désigner le moteur MySQL à administrer. En utilisation monoposte, ou en réseau, si l'outil est lancé sur le serveur, vous devez renseigner les paramètres en vous inspirant de la copie d'écran ci-dessous :

Lorsque vous appuyez sur le bouton "Ok", il peut parfois arriver que le message suivant apparaisse :

Could not find settings.
Either the server service or the configuration file could not be found. Startup variables and service section are therefore disabled.

MySQL Administrator se lance quand-même mais, puisqu'il n'a pas pu trouver le fichier de configuration (my.cnf), les fonctions de paramétrages sont désactivées.

Pour lui indiquer où se trouve my.cnf, comme le montre la copie d'écran ci-dessous, allez dans le chapitre Service Control puis dans l'onglet Configure Service et renseignez la case Config Filename.

Configuration

Le paramétrage s'effectue dans la section Startup Variables.

Max. packet size

Le paramètre le plus important se trouve dans l'onglet Advanced Networking. Il s'agit de la variable Max. packet size.

Cette variable définit la taille maximale des paquets de données que MySQL accepte de recevoir ou d'émettre. Lors de l'installation de MySQL, elle est fixée est fixée à 1 Mo, ce qui veut dire que si on tente de demander à MySQL de stocker un ensemble de données et que la requête correspondante dépasse 1 Mo, cette demande n'est pas traitée par le moteur.
L'existence de ce paramètre protège le moteur des attaques par "buffer overflow" (envoit d'une requête dont le volume dépasse la taille prévue par le moteur afin de le rendre instable et vulnérable à une prise en main par le pirate).

Une valeur maximale de 1 Mo peut s'avèrer insuffisante pour Episodus en cas de récupération d'un gros fichier patient ; il est vivement conseillé de la fixer à 16 Mo, comme montré dans l'écran ci-dessous.

Disable name resolving

Si votre serveur vous semble lent lors de la première connexion, il se peut que la variable Disable name resolving soit en cause.

Lorsqu'un client se connecte au moteur MySQL, ce dernier n'en connait initialement que l'adresse IP (une série de 4 chiffres qui identifie la machine de façon unique sur le réseau). Mais le comportement par défaut de MySQL est, lors de la première connexion d'un client, de chercher à trouver son nom d'ordinateur (par exemple "poste secrétariat"). Ce processus, qui nécessite d'interroger un composant du réseau appelé DNS peut s'avérer très long sur certains réseaux et il est alors préférable de paramétrer MySQL pour qu'il se contente de connaitre l'adresse IP de ses clients.

La désactivation de la recherche du nom des clients se fait dans la même page que le paramétrage du Max. packet size décrit ci dessus. Il suffit de cocher la case Disable name resolving comme le montre la copie d'écran ci-dessous.

Configuration manuelle

Il est possible de fixer manuellement les paramètres décrits ci-dessus en modifiant le fichier my.cnf (avec Bloc-notes, par exemple). Il faut alors être particulièrement attentif à ne pas faire de faute de frappe. Si vous le pouvez, faites des copier-coller à partir de ce texte.

Max. packet size

Pour modifier le paramètre Max. packet size, insérez les lignes ci-dessous (les lignes qui commencent par un '#' sont des commentaires, elles sont donc optionnelles... mais bien précieuses) :

#Max packetlength to send/receive from to server.
max_allowed_packet=16M

Disable name resolving

Pour modifier le paramètre Disable name resolving, insérez les lignes ci-dessous :

#Don't resolve hostnames. All hostnames are IP's or 'localhost'.
skip-name-resolve

Relancer le service

Le fichier de configuration est pris en compte au démarrage de MySQL. Il est donc nécessaire, pour que vos modifications manuelles soient effectives, d'arrêter, puis de relancer le service MySQL. Vous pouvez réaliser cette opération de deux façons :

  1. Soit en ouvrant une Invite de commandes (Menus Démarrer/Tous les programmes/Accessoires/Invite de commande) et, dans la fenêtre "noire" en tapant successivement :
    net stop mysql puis la touche <Entrée> (qui arrête le service), puis
    net start mysql puis la touche <Entrée> (qui le relance).
  2. Soit en passant par l'interface de gestion des services :

Particularités sous Linux

Sous Linux, les noms de fichier sont sensibles à la casse, contrairement à Windows. C'est également le cas pour le nom des tables sous MySQL. Il est possible de modifier (ou de créer) la variable lower_case_table_names dans le fichier my.ini comme indiqué dans le tableau ci-dessous.

Value Meaning
0 Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive.

Note that if you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result.
1 Table names are stored in lowercase on disk and name comparisons are not case sensitive. MySQL converts all table names to lowercase on storage and lookup.
This behavior also applies to database names and table aliases.
2 Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive.
This works only on file systems that are not case sensitive! InnoDB table names are stored in lowercase, as for lower_case_table_names=1.