L'Autre Net Bureau · Webmail · Aide · Wiki · Interventions · Irc · Mon
 

Cette rubrique à pour vocation de mettre en avant les erreurs communes qui peuvent-être faites lorsque l'on crée un site dynamique utilisant une base de donnée relationnelle.

À titre d'exemple, nous allons considérer une table log d'une application. La structure de la table est la suivante:

log
id date evt_id texte
int(10) datetime int(5) TEXT(500)
4 14 4 500

Pour simplifier les calculs, nous considérons que chaque ligne fasse 500+4+14+4 octets, soit 522 octets.

La table contient 100'000 lignes.

Essayons de voir les différents traitements que l'on pourrait faire sur cette table, et en quoi ils sont bien ou pas biens.

Ne selectionner que les champs utiles

Il est pratique d'utiliser le wildcard (*) pour ne pas préciser les champs à sélectionner lors d'une requête.

SELECT * FROM log;

Dans le cas de notre table de log, on remarque que la colonne `texte` est particulièrement volumineuse. Si l'on en a pas besoin, il vaut donc mieux énumérer les colonnes que l'on souhaite récupérer individuellement, par exemple:

SELECT DATE FROM log WHERE evt_id = 5;

Qu'est ce que ça change?

Bien, si l'on considère que notre requête nous a renvoyé 250 lignes, nous avons transféré (en ne prennant en compte que la réponse):

250*14 = 3500 octets contre 250*522 = 130500 octets, soit 3% du volume!

Limiter le nombre de résultats par requêtes

Notre table de log étant assez conséquente (100'000 lignes), on peut avoir tendance à manipuler un gros volume de données. Reprennons l'exemple précédent:

SELECT DATE FROM log WHERE evt_id = 5;

Peut-être que seul les 5 derniers événements nous interessent, du coup, il peut-être judicieux de limiter la taille renvoyée par MySQL:

SELECT DATE FROM log WHERE evt_id = 5 ORDER BY DATE DESC LIMIT 5;

Le volume de donnée échangé est alors de 14*5 = 70 octets…

Prosrire les "ORDER BY RAND"

FIXME le lien donné sur root@

Diagnostiquer les problèmes sur une requête longue

Voici quelques éléments de réflexion sur ce point:

  • Les unions sont plus rapides que les requêtes imbriquées (oui peut-être moins claires)
  • Il manque un index sur une table
  • le volume de donnée à traiter est trop grand
  • le type des données à traiter n'est pas adéquat (opération sur du texte sans full text par exemple)
  • il faut optimiser la table (OPTIMIZE, REPAIR) FIXME

Utiliser la commande EXPLAIN suivi de votre requête peut-aider:.

References

 
optimisation/mysql.txt · Dernière modification: 2013/05/31 18:00 par fser
[unknown button type]
 
Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC Attribution-Noncommercial-Share Alike 4.0 International
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki