REQUETE sql lente

Fermé
tic1992 Messages postés 1 Date d'inscription lundi 28 avril 2014 Statut Membre Dernière intervention 28 avril 2014 - 28 avril 2014 à 22:15
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 - 2 mai 2014 à 20:07
Bonjour j'implémente un moteur de recherche avancé pour un site web et voici ma requête sql

SELECT DISTINCT spip_articles.titre AS t, spip_articles.id_article,spip_articles.id_rubrique,j.titre o, e.titre v, u.titre a, spip_documents.contenu AS c,spip_documents.fichier, u.id_secteur, spip_auteurs.nom AS d,spip_mots.titre AS f FROM spip_articles
LEFT JOIN spip_auteurs_articles ON spip_auteurs_articles.id_article= spip_articles.id_article
LEFT JOIN spip_auteurs ON spip_auteurs.id_auteur= spip_auteurs_articles.id_auteur
LEFT JOIN spip_rubriques u ON u.id_rubrique = spip_articles.id_rubrique
LEFT JOIN spip_rubriques e ON u.id_parent = e.id_rubrique
LEFT JOIN spip_rubriques j ON e.id_parent = j.id_rubrique
LEFT JOIN spip_mots_articles ON spip_mots_articles.id_article=spip_articles.id_article
LEFT JOIN spip_mots ON spip_mots.id_mot=spip_mots_articles.id_mot
LEFT JOIN spip_documents_liens ON spip_documents_liens.id_objet=spip_articles.id_article
LEFT JOIN spip_documents ON spip_documents.id_document=spip_documents_liens.id_document
WHERE ((spip_articles.titre LIKE '".$_GET['mot']."' OR spip_articles.chapo LIKE '".$_GET['mot']."'' OR spip_auteurs.nom LIKE '".$_GET['mot']."' OR u.titre like '".$_GET['mot']."' OR match(spip_documents.contenu) against ('".$_GET['mot']."' IN boolean mode))"
au moment de l'exécution sa prend du temps "57s" alors si quelqu'un a une idée sur l'optimisation de cette requête je serai très reconnaissante :D

1 réponse

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
2 mai 2014 à 20:07
Bonjour,

Oui, j'ai une idée....

Il faut indexer TOUS LES CHAMPS sur lesquels vus faites des jointures, par exemple:

...
LEFT JOIN spip_rubriques e ON u.id_parent = e.id_rubrique
...

Idem sur les champs sur lesquels vous faites des WHERE:

WHERE ((spip_articles.titre LIKE '".$_GET['mot']."' OR spip_articles.chapo LIKE '".$_GET['mot']."'' OR spip_auteurs.nom LIKE '".$_GET['mot']."' OR u.titre like '".$_GET['mot']."' OR match(spip_documents.contenu) against ('".$_GET['mot']."' IN boolean mode))"

Si vous avez un seul champ pas indexé, ça freinera très fort....

Ha, autre chose, faire des concaténations à partir des $_GET est une faute grave de sécurité. Vous risquez l'injection de code!
https://www.php.net/manual/fr/security.database.sql-injection.php



A+

0