IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Grosse table mysql : comment optimiser les temps de requetes ?


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 7
    Points
    7
    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

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Rien mise à part que le faite d'utiliser la fonction beetwen. Il faut faire plusieurs test du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    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 ?

  4. #4
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    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 !...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    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

  6. #6
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Si j'ai bien compris la requête est du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/11/2016, 14h03
  2. Réponses: 2
    Dernier message: 13/02/2015, 20h30
  3. [AC-2003] importation de donnée excel vers access : comment optimiser les tables ?
    Par pshd22 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 31/03/2009, 18h17
  4. Comment optimiser les temps de réponse d'une requête ?
    Par renaudjuif dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/02/2007, 14h12
  5. [MySQL] Comment connaître les noms des tables existantes
    Par Cygnus Saint dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/03/2006, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo