Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2008, 14h44   #1
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Par défaut Grosse table mysql : comment optimiser les temps de requetes ?

Bonjour,

J'ai un table Mysql avec beaucoup d'enregistrements (3 millions) comprenant :
numero_debut ; numero_fin ; valeur

J'ai besoin par un simple select, récupérer la valeur pour un numéro compris entre numero_debut et numero_fin

Ma question est simple : quels sont tous les critères qui permettent d'optimiser les temps de requetes, sachant que j'ai déjà :

- ma table est en MyISAM (plus adaptée pour les requetes de type "select")
- j'ai créé 2 index sur numero_debut et numero_fin

Il y a aussi le processeur, je suppose (critère sur lequel je ne peux pas agir )
Et sinon ?



Merci de vos réponses
stade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 15h08   #2
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 986
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 986
Points : 3 568
Points : 3 568
Rien mise à part que le faite d'utiliser la fonction beetwen. Il faut faire plusieurs test du genre

Code :
1
2
3
4
SELECT * FROM maTable WHERE monCHamp => xxxx AND monChamp <= xxxx;
SELECT * FROM maTable WHERE monCHamp BETWEEN xxxx AND xxxx;
SELECT * FROM maTable WHERE monCHamp IN(SELECT id FROM maTable WHERE monCHamp BETWEEN xxxx AND xxxx);
SELECT * FROM maTable WHERE monCHamp IN(SELECT id FROM maTable WHERE monCHamp => xxxx AND monChamp <= xxxx);
En effectuant chacune de ces requêtes tu prends celle la moins longues. Peu être qu'il y a d'autre requête pouvant donner d'autre résultat.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 15h49   #3
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Merci de ta réponse.
J'avais déjà le between et c'est la solution qui semble la plus rapide.
Cependant, la requête met une a 2 secondes à s'éxécuter, ce qui me parait trop long.

Je suis sous un processeur pentium 3.2Ghz : on peut gagner beaucoup de temps (odre de grandeur ?) avec un processeur plus rapide ?
stade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 19h45   #4
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 986
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 986
Points : 3 568
Points : 3 568
Tu plaisantes j'espère. 1 à 2 secondes pour 3 millions d'enregistrements ? Estime toi heureux
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2008, 14h44   #5
Futur Membre du Club
 
Inscription : mars 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 37
Points : 16
Points : 16
jette un oeil sur ce lien et télécharger les cours et regarde le chapitre sur les index() et les optimisations !!

site : http://cyberzoide.developpez.com/php4/mysql/
lien ftp fichier cible ftp://ftp2.developpez.be/developps/php/mysql.pdf

en espérant que cela poura 'aider






Nicolas

http://www.carnetduglobe.com
bleubykey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 12h40   #6
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
Si j'ai bien compris la requête est du genre :
Code :
1
2
 
SELECT valeur FROM matable WHERE ? BETWEEN numero_debut AND numero_fin
J'ai peur que ce soit non indexable. Que l'on utilise un index sur numero_debut ou numero_fin il va toujours y avoir beaucoup de valeurs à tester, contrairement à des requêtes sur "WHERE numero_debut BETWEEN ? AND ?" par exemple.


Dans les trucs à tenter il y aurait UN index sur numero_debut ET numero_fin. Pas idéal mais ça pourrait aider.


Sinon, est-ce que les intervalles sont disjoints ? Si c'est le cas on a au plus un résultat dont il est possible d'ajouter un "LIMIT 1" pour limiter la casse. Ou mieux faire :
Code :
1
2
 
SELECT * FROM matable WHERE numero_debut<=? ORDER BY numero_debut DESC LIMIT 1;
et regarder si l'intervalle correspond, ou carrément faire :
Code :
1
2
3
4
5
6
7
 
SELECT valeur
FROM (SELECT *
      FROM matable
      WHERE numero_debut<=?
      ORDER BY numero_debut DESC LIMIT 1) sousTable
WHERE ? BETWEEN numero_debut AND numero_fin
(Cela dit pas testé la syntaxe)

Sinon il y aurait peut-être les indexes spatiaux. Je n'ai pas d'expérience avec mais il seraient peut-être plus adaptés que les indexes usuels puisque que les enregistrements sont des segments [numero_debut ; numero_fin] et que l'on veux trouver sur lesquels est placé un point.

Dernières idées, mieux tirer parti de la RAM (3 millions ce n'est pas tant que ça) en utilisant innodb (qui n'est pas forcément plus lent) ou alors MyIsam avec un cache des clefs plus grand et un index sur 'numero_debut', 'numero_fin' et peut-être même 'valeur' pour ne plus toucher au disque ni au cache de l'OS.

Citation:
Envoyé par stade Voir le message
Je suis sous un processeur pentium 3.2Ghz : on peut gagner beaucoup de temps (odre de grandeur ?) avec un processeur plus rapide ?
Ben, je ne sais pas s'il y a tant que ça plus rapide... Pour une unique requête mysql n'a qu'un seul thread donc les multicoeur ne raccourciront pas le délai en lui même. Au gros (mais vraiment gros) pifomètre je dirais pas plus d'un facteur 2 à gagner.
Sivrît est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h21.


 
 
 
 
Partenaires

Hébergement Web