Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 18/07/2011, 17h54   #1
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Par défaut Priorité de requetes

Bonjour @ tous,

j'espère que vous pourrez m'aider car j'ai soucis avec un de mes sites.

Situation :
Les données sont telles que j'ai mise en place un système de cache (memcache).
Et pour gérer la mise à jour de mes données en cache j'utilise ma crontab pour vérifier que les dates de mise à jour de certains champs n'est pas plus récent que la version de mon cache (info aussi en base)
Donc je fais 2 jointures sur une table de 250.000 lignes qui dure environ 8 secondes pour me retourner les ID des caches a régénérer.

Problème :
Mon soucis c'est que la requête en question semble prioritaire et que pendant son exécution les visiteurs attendent en ce demandant ce qu'il se passe.

Le temps d'exécution de cette requête ne me gène pas plus que ça vu qu'elle tourne en tache de fond. Mais je voudrais faire en sorte qu'elle ne soit prioritaire sur aucune autre requête... Il me semble que c'était possible.

Mes tables sont en InnoDB avec des champs "integer" indexés pour les dates (unix_datetime) que l'on compare.

Exemple du type de requête :
Code :
1
2
3
4
5
SELECT tab_prod.id 
FROM tab_prod_to_image
INNER JOIN tab_image ON tab_prod_to_image.id_image = tab_image.id
INNER JOIN tab_prod ON tab_prod_to_image.id_fiche = tab_prod.id_fiche
WHERE tab_image.date_modif > tab_prod.cache_date
Merci d'avance pour votre temps (et vos conseils)
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 16h28   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 305
Points : 18 305
Envoyer un message via MSN à CinePhil
8 secondes pour exécuter ta requête avec seulement 250 000 lignes, ce n'est pas normal !
Tes tables sont-elles correctement indexées ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h25   #3
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Oui pas de soucis sur l'indexation de mes tables.

C'est pas une table de 250.000 lignes mais une jointure entre 3 tables d'au moins 250.000 lignes chacune, joint sur une clé.

Cette requête est optimisé à son extrême, et je ne pense pas qu'on puisse faire mieux.
Le système assez ancien y est sûrement aussi pour beaucoup mais n'est pas non plus changeable.

Ce que je voudrais surtout c'est que la requête ne ralentisse pas les autres.
J'ai d'autre requête qui me pose le même soucis. Je voudrais qu'elles soient "non-prioritaires".
J'ai vu des choses pour définir certaines priorités dans l’exécution mais rien pour baisser la priorité.

Avez-vous une idée ?
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h56   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 305
Points : 18 305
Envoyer un message via MSN à CinePhil
Même avec 3 tables de 250 000 lignes, ça fait quand même long !

On peut avoir le résultat de EXPLAIN ta requête ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 11h02   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous pouvez toujours regarder du coté du HIGH_PRIORITY
Mais comme CinePhil, je pense que 8 secondes pour une requete avec une jointure, cela me parait anormal... (Indexes, condition de restriction, ... )
Vous pouvez poster un plan d'execution, juste pour information ?

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 14h19   #6
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Un petit explain :

Code :
1
2
3
4
5
6
7
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
| id | select_type | TABLE                   | type | possible_keys             | KEY      | key_len | ref                                    | rows   | Extra       |
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
|  1 | SIMPLE      | tab_prod_to_image       | ALL  | id_fiche,id,id_copy       | NULL     | NULL    | NULL                                   | 114538 |             |
|  1 | SIMPLE      | tab_image               | ref  | id                        | id       | 4       | db_test.tab_prod_to_image.id           |      1 |             |
|  1 | SIMPLE      | tab_prod                | ref  | id,cache_date             | id       | 4       | db_test.tab_prod_to_image.id_fiche     |      1 | USING WHERE |
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
Citation:
Vous pouvez toujours regarder du coté du HIGH_PRIORITY
En fait, je cherche justement à faire l'inverse de cette fonction...
Je veux que les 500 ou 1000 autres requêtes possibles soient prioritaire sur celle là. Je restais persuadé que c'était possible avec un truc comme :
SELECT LOW_PRIORITY xxx ...
mais je trouve pas.

Citation:
Vous pouvez poster un plan d'execution, juste pour information ?
C'est à dire ?

Merci pour vos réponses
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 14h29   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous n'avez pas d'index sur la colonne date_modif de la table tab_image ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 14h56   #8
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Si si, le champs est bien indexé
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 16h32   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 305
Points : 18 305
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par LynxEyes Voir le message
Si si, le champs est bien indexé
On ne le voit pas dans l'EXPLAIN !

Par contre, on voit qu'il n'y a que 114 538 lignes de parcourues, ce qui devrait être très rapide.

As-tu essayé de lancer la requête directement dans une console MySQL ou sur phpMyAdmin ? Le résultat devrait apparaître quasi immédiatement. Si ça dure quand même 8 secondes, c'est que ton serveur sature. Si c'est immédiat par ce canal, c'est que la lenteur vient d'ailleurs.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 17h05   #10
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Citation:
On ne le voit pas dans l'EXPLAIN !
On devrait ? alors qu'elle est dans le where ?
Je viens de vérifier elle y est.

En local elle dure 2.4 sec
Sur le serveur quadri-core de test à peu prêt autant
Mais chez le client : entre 6 et 8 sec

Elle pourrait durer 15 secondes ça ne me générait pas plus que ça... Ce qui est important c'est qu'elle ne mette pas les autres en attente => d'où la question : comment faire pour la dé-prioritarisé (<= super le mot) la requête ?

PS : en local j'utilise SQL_NO_CACHE pour vérifier que mysql ne prend pas le cache et voir les "vrais" perfs.
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 19h26   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 305
Points : 18 305
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par LynxEyes Voir le message
On devrait ? alors qu'elle est dans le where ?
Je viens de vérifier elle y est.
Ce qu'on ne voit pas c'est la colonne tab_image.date_modif du WHERE dans la colonne possible_keys de l'EXPLAIN ! Ce qui laisse à penser que cette colonne tab_image.date_modif n'est pas indexée.

Citation:
En local elle dure 2.4 sec
C'est encore beaucoup !
Le résultat devrait être immédiat, en tout cas dans une console MySQL ou dans phpMyAdmin !

On peut avoir la description des tables issue de SHOW CREATE TABLE nom_de_la_table ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 10h42   #12
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Autant pour moi, j'avais 2 dates indexées mais pas celle là.
C'est rajouté :

Code :
1
2
3
4
5
6
7
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
| id | select_type | TABLE                   | type | possible_keys             | KEY      | key_len | ref                                    | rows   | Extra       |
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
|  1 | SIMPLE      | tab_prod_to_image       | ALL  | id_fiche,id,id_copy       | NULL     | NULL    | NULL                                   | 114538 |             |
|  1 | SIMPLE      | tab_image               | ref  | id,date_modif             | id       | 4       | db_test.tab_prod_to_image.id           |      1 |             |
|  1 | SIMPLE      | tab_prod                | ref  | id,cache_date             | id       | 4       | db_test.tab_prod_to_image.id_fiche     |      1 | USING WHERE |
+----+-------------+-------------------------+------+---------------------------+----------+---------+----------------------------------------+--------+-------------+
Au passage ça m'a permis de gagner 0.6 sec, pour cette requête je suis a 1.8 sec.

Pour info j'ai trouvé un autre endroit où je fais la même requête pour des tables équivalentes mais avec un peu plus de ligne (20 fois plus) ça met 4.75 sec au lieu de 6 sec (sûrement + de 10 sec chez le client)
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2011, 23h27   #13
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 859
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 859
Points : 1 340
Points : 1 340
salut,

regarde les réglages mysql, essaye de jouer sur les différents caches dont celui pour les jointures...

tu y gagneras encore peut-être un peu... si tout est bien indexé les performances dépendent ensuite juste de la charge d'activité et de ce que doit bufferiser mysql...

à voir donc
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 09h41   #14
Invité de passage
 
Homme
Développeur Web
Inscription : juillet 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2011
Messages : 8
Points : 0
Points : 0
Ok, merci je vais y jeter un œil
LynxEyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 18h14   #15
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 859
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 859
Points : 1 340
Points : 1 340
je te conseille de lire ça

à savoir que tu peux gagner aussi du temps en forçant l'utilisation des indexes, ça désactive l'optimiseur en utilisant using
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement 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 13h16.


 
 
 
 
Partenaires

Hébergement Web