REQUETE sql lente
tic1992
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
mpmp93 Messages postés 6648 Date d'inscription Statut Membre Dernière intervention -
mpmp93 Messages postés 6648 Date d'inscription Statut Membre Dernière intervention -
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))"
A voir également:
- REQUETE sql lente
- Logiciel sql - Télécharger - Bases de données
- Free connexion lente 4g ✓ - Forum Freebox
- Blob sql ✓ - Forum Webmastering
- Sql (+) - Forum Programmation
- 4g lente free - Forum Free mobile
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+
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+