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

PHP & Base de données Discussion :

Requête trop lourde?


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 44
    Points
    44
    Par défaut Requête trop lourde?
    Bonjour,

    Depuis un script PHP j'ai une erreur "Maximum execution time of 30 seconds exceeded" très probableemnt en raison d'une requête SQL sur une base MySQL qui pourrait être (grandement) améliorée.

    Voici ma requête qui s'exécute environ 30 fois (une fois par jour d'un mois donné).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT pk_id FROM events_vk, plz_ptt
    WHERE '2007-01-01' BETWEEN date_start AND GREATEST(date_end, date_start)
    ici je demande les events qui ont lieu le 1er janvier 2007.

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT pk_id FROM events_vk, plz_ptt 
    WHERE '2007-01-01' BETWEEN date_start AND GREATEST(date_end, date_start) 
    AND (events_vk.fk_plz_ptt = plz_ptt.ExchangeKey) 
    AND (plz_ptt.PostalCode >= 1000) AND (plz_ptt.PostalCode <= 2000)
    Dans ce cas deuxième cas tous les events qui ont lieu le 1er janvier 2007 et dont le code postal est compris entre 1000 et 2000.

    La table events_vk gère des événements et j'utilise la table plz_ptt en jointure pour localiser les événements selon leur code postal. En effet la table plz_ptt contient 6723 lignes avec tous les codes postaux de Suisse.

    Les deux tables sont reliées par la clé étrangère fk_plz_ptt de la table events_vk et la colonne (valeur unique) ExchangeKey de la table plz_ptt.

    Comment améliorer ma requête pour pas que je dépasse ce délai attrbué à PHP? C'est donc une question d'optimisation de requête SQL, je sais...

    Merci!

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Les index sont déclarés sur les colonnes mentionnées ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    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
    Il semble manquer une condition dans la première requête. S'il y a comme je le pense beaucoup de 'events_vk' ça peut faire très mal.

    Indexer les dates pourrait aussi aider. Et si ça ne suffit pas il restera la possibilité de faire des indexes mixtes (comme (plz_ptt.ExchangeKey, plz_ptt.PostalCode) qui serrait pas mal).

    "GREATEST(date_end, date_start)" huh... ça arrive souvent de finir avant d'avoir commencé ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Sivrît
    Il semble manquer une condition dans la première requête. S'il y a comme je le pense beaucoup de 'events_vk' ça peut faire très mal.
    En fait, c'est la seconde requête qui pose problème, la première est rapide, n'agissant que sur une table.

    Citation Envoyé par Sivrît
    Indexer les dates pourrait aussi aider. Et si ça ne suffit pas il restera la possibilité de faire des indexes mixtes (comme (plz_ptt.ExchangeKey, plz_ptt.PostalCode) qui serrait pas mal).
    J'ai indexé aussi les dates, ça ne change rien... Que sont les indexes mixtes? C'est-à-dire indexer aussi les colonnes de jointures de la deuxième table? Déj fait...

    Citation Envoyé par Sivrît
    "GREATEST(date_end, date_start)" huh... ça arrive souvent de finir avant d'avoir commencé ?
    C'est que la base n'est pas "propre", certains date_end sont à 0000-00-00 alors je gère cela ainsi...

  5. #5
    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
    Citation Envoyé par gb-ch
    J'ai indexé aussi les dates, ça ne change rien... Que sont les indexes mixtes? C'est-à-dire indexer aussi les colonnes de jointures de la deuxième table? Déj fait...
    "composé" serait peut-être plus approprié. Ce sont des indexes portant sur plusieurs colonnes. Comme un seul index peut servir par table, avoir deux indexes sur une table à laquelle deux critères sont appliqués dans une requête ne sert à rien car un seul sera utilisé (par exemple pour une jointure, l'inégalité étant ensuite testée sur tous les résultats).

    Il faudrait voir ce que donne un 'EXPLAIN' pour savoir ce qui se passe. Sinon, quels sont exactement les indexes déjà créés ?

Discussions similaires

  1. Requête trop lourde
    Par Freedolphin dans le forum Requêtes
    Réponses: 9
    Dernier message: 08/01/2014, 14h54
  2. Une requête trop lourde pour un site internet
    Par buggen25 dans le forum Requêtes
    Réponses: 0
    Dernier message: 16/09/2013, 12h35
  3. [MySQL] Requète trop lourde qui me fait planter mon chargement
    Par runner77 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 30/01/2009, 09h58
  4. [CGI] variable de session trop lourde ????
    Par LE NEINDRE dans le forum Web
    Réponses: 2
    Dernier message: 07/10/2005, 09h12
  5. Réponses: 11
    Dernier message: 22/03/2005, 01h04

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