REQUETE sql lente
Bonjour j'implémente un moteur de recherche avancé pour un site web et voici ma requête sql
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
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))"
1 réponse
-
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+