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 02/08/2011, 08h14   #1
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 3 406
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 42
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 3 406
Points : 6 681
Points : 6 681
Par défaut ORDER BY varchar et INDEX

Bonjour, j'ai un cas de figure que je ne m'explique pas.

Pouvez-vous m'éclairer.

J'ai
- un serveur MySQL 5.1.49 (EasyPHP 5.3.3)
- une base InnoDB contenant entre autres 3 champs varchar (30, 25 et 30) NOM, PRENOM, SURNOM de 172000 enregistrements.
- la base est indexée sur un champ code

si je fais un SELECT * FROM table1 ORDER BY NOM, PRENOM, SURNOM LIMIT 5000, 100 ça prend un temps fou.

EXPLAIN me montre qu'aucun index n'est utilisé et indique un "Using filesort"

si j'ajoute un index
ALTER TABLE table1 ADD INDEX nom (NOM, PRENOM, SURNOM)
j'ai exactement le même résultat !!

j'ai voulu ruser en créant une seconde table contenant un id auto et le champ code de la première et en l'alimentant par
INSERT INTO table2 (CODE) VALUES (SELECT CODE FROM table1 ORDER BY NOM, PRENOM, SURNOM).

avec la requête SELECT * FROM table2 i JOIN table1 t ON t.CODE = i.CODE j'obtiens bien mes enregistrements triés...mais avec des temps de réponse tout aussi catastrophiques et toujours aucun index sur i et un "Using filesort".

Qu'est-ce qui m'échappe dans tout cela ?!

Merci
__________________
Developpez.com: Mes articles
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice sous Delphi
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 10h01   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
SAluton,
Je ne comprends pas pourquoi tu ne crées pas, simplement, un index sur chacune des trois colonnes NOM, PRENOM et SURNOM
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 10h27   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
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 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
Maljuna Kris, il me semble que son idée d'ajouter un index multi-colonnes sur les trois colonnes de l'ORDER BY et dans le même ordre était pourtant une bonne idée et cet index devrait être utilisé non ?

Paul, tu peux nous donner la définition exacte de la table (résultat de SHOW CREATE TABLE la_table), la requête exacte qui prend un temps fou et le résultat de EXPLAIN la_requete ?
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 13h04   #4
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
Est ce que le fait d'enlever * permet de modifier l'explain plan ?

Code :
1
2
3
4
5
6
7
8
SELECT 
  NOM, PRENOM, SURNOM 
FROM 
  table1 
ORDER BY 
  NOM, PRENOM, SURNOM 
LIMIT 
  5000, 100
__________________
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 02/08/2011, 14h09   #5
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 3 406
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 42
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 3 406
Points : 6 681
Points : 6 681
Bonjour,

en effet si je ne sélectionne que les 3 champs en question MySQL utilise l'index...mais ça limite beaucoup l’intérêt de la chose ^^

J'ai également 2 champs TEXT qui rallongent manifestement le traitement (tout le reste est du varchar)

En fait le but du jeu est d'identifier des doubles suivant les règles suivantes

- même nom, prenom, surnom
- tous les autres champs sont soit vides, soit égaux
- conserver toutes les valeurs non vides.

exemple:
1, 'PAUL', 'TOTH', '', '42',NULL,'Blahblah'
2,' PAUL', 'TOTH', '', NULL, '974',NULL
3,' PAUL', 'TOTH', '', '42', '974',NULL

sera fusionné (dans une autre table) en un seul enregistrement
1, 'PAUL', 'TOTH', '', '42', '974','Blahblah'

pour cela j'utilise une moulinette PHP qui prend la table triée par nom/prenom/surnom et qui gère la comparaison des champs suivants.
__________________
Developpez.com: Mes articles
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice sous Delphi
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 14h36   #6
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
Pouvez-vous vérifier l'explain plan avec ce genre de requête :

Code :
1
2
3
4
5
6
SELECT
  Min(CODE), nom, prenom, surnom, colM, colN, colO , Max (COALESCE (colX,'')) AS colX , Max (COALESCE (ColY,'')) AS ColY...
FROM
  Table1
GROUP BY 
  nom, prenom, surnom, colM, colN, colO
Si cela est OK, il ne vous reste plus qu'à insérer vos données dans la table cible.

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 02/08/2011, 17h01   #7
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 3 406
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 42
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 3 406
Points : 6 681
Points : 6 681
Arf ! la même manipulation sur un serveur 4.x fonctionne parfaitement !

Y aurait-il un bug connu sur la 5.1.49-community ?
__________________
Developpez.com: Mes articles
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice sous Delphi
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 17h16   #8
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
Ou une régression, car un bug similaire était connu dans une version 3 je crois ...
__________________
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h08.


 
 
 
 
Partenaires

Hébergement Web