|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 7 ![]() |
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 |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 986 ![]() |
Rien mise à part que le faite d'utiliser la fonction beetwen. Il faut faire plusieurs test du genre
Code :
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !... |
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 7 ![]() |
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 ? |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Développeur informatique Inscription : février 2005 Messages : 2 986 ![]() |
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 !... |
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : mars 2008 Messages : 37 ![]() |
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 |
|
|
00
|
|
|
#6 | ||||||
|
Membre Expert
![]() Inscription : février 2006 Messages : 953 ![]() |
Si j'ai bien compris la requête est du genre :
Code :
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 :
Code :
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. 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. |
||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com