Reduire et optimiser une requete sql

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par sff, 8 Décembre 2016.

  1. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    525
    J'aime reçus:
    0
    Bonjour,

    je souhaite réduire et optimiser si possible cette requete sql :

    Code:
    "SELECT name_real, zip FROM cities WHERE name_real LIKE (:keyword_1) OR name_real LIKE (:keyword_2) OR name_slug LIKE (:keyword_1) OR name_simple LIKE (:keyword_2) OR zip LIKE (:keyword_1) ORDER BY name_real ASC LIMIT 0, 10"
    Elle possède une succession de OR et je souhaite savoir si cela est possible de tout combiner afin de réduire le temps d’exécution.

    Merci
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 722
    J'aime reçus:
    232
    Je ne vois pas trop comment réduire cette taille.

    NB: LIKE pour une recherche c'est un peu cheap, avec ton exemple d'hier: Pont l'Abbé, si on cherche "pont abbé" ça trouvera pas => Cfr. recherche full text.
     
  3. elji
    elji WRInaute occasionnel
    Inscrit:
    6 Juin 2009
    Messages:
    279
    J'aime reçus:
    5
    Ouais, faut éviter de faire ça, une requête avec 5 LIKE c'est assez monstrueux. Faut procéder autrement.
     
  4. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    525
    J'aime reçus:
    0
    Si on reprends l'exemple de Pont-l'Abbé (nom réel), cela peut d'écrire pour une personne de plusieurs manière :

    pont-labbé
    pont labbé
    pont l'abbé

    C'est comme La Grande-Motte (nom réel)

    Cela peut s'écrire de plusieurs manière :

    la grande motte
    la-grande-motte
    grande motte

    Alors comme sortir le resultat à coup sur sachant que dans ma table j'ai 3 champs exploitable (nom réel, nom slug et nom simple) ?

    Pour Pont-l'Abbé :

    Nom réel : Pont-l'Abbé
    Nom slug : pont-l-abbe
    Nom simple: pont l abbe

    En dehors des like j'ai du mal à trouver la solution
     
  5. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 722
    J'aime reçus:
    232
    Je te l'ai dit: full text.
     
  6. niap
    niap WRInaute discret
    Inscrit:
    17 Octobre 2009
    Messages:
    139
    J'aime reçus:
    0
    Il faut que tu fasse des recherches avec LIKE % plutôt que LIKE seul.
    Par exemple LIKE %grande-motte% trouve la-grande-motte

    Si tu cherche d'autres solution pour les recherches textuelles : http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

    A voir aussi s'il ne faudrait pas supprimer les articles du champ slug :
    Le nom d'affichage : Pont l'Abbé / La Grande-Motte
    Le nom de recherche : pont-abbe / grande-motte

    Ça te permettrait de trouver Pont l'Abbé que la recherche soit Pont l'abbé, Pont abbé, l'abbé, etc
     
  7. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    525
    J'aime reçus:
    0
    tu n'aurais pas un modèle, tuto... à me montrer ?

    Je ne connais pas
     
  8. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    8 722
    J'aime reçus:
    232
  9. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    525
    J'aime reçus:
    0
    Je viens de tester, ca fonctionne parfaitement pour le nom d'une ville non composé comme montpellier, mais pour un nom composé comme pont l'abbé et la grande motte (toujours les meme exemples) ca me sort une liste de 50 villes, donc celles en question.

    Code:
    SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('".$_POST['keyword']."' IN BOOLEAN MODE);
     
  10. sff
    sff WRInaute impliqué
    Inscrit:
    2 Février 2005
    Messages:
    525
    J'aime reçus:
    0
    J'ai fais ceci pour qu'il cherche chaque composition du nom de la ville, du genre pont l'abbé se transforme en pont +l +abbe

    Vous en pensez quoi?

    Code:
    $keyword = str_replace("-", " +", slug($_POST['keyword']));
    
    $sql = "SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('+".$keyword."' IN BOOLEAN MODE);";
     
  11. niap
    niap WRInaute discret
    Inscrit:
    17 Octobre 2009
    Messages:
    139
    J'aime reçus:
    0
    Ça a l'air pas mal vu comme ça, quels sont les résultats ?

    Si tu ne met pas * à la fin des tes mots clés, la recherche sera stricte, c'est voulu ?
    SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('+pari' IN BOOLEAN MODE)
    Ne trouvera pas paris

    Il semblerait que, par défaut, l'indexation minimale est de 4 caractères :
    http://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html
    Vérifies ta configuration, sinon les habitants des Gap et de Die ne trouveront jamais rien ;-)
     
Chargement...
Similar Threads - Reduire optimiser requete Forum Date
Réduire sa dépendance à Google Le café de WebRankInfo 22 Mai 2019
WORDPRESS Woocommerce, vos astuces pour réduire CPU usage et serveur stress ? e-commerce 22 Juin 2018
Est ce que je peux réduire ce code ? Développement d'un site Web ou d'une appli mobile 4 Avril 2017
Réduire un bout de code Développement d'un site Web ou d'une appli mobile 5 Février 2017
Reduire des lignes de code php Développement d'un site Web ou d'une appli mobile 5 Novembre 2016
Réduire le taux de rebond d'un site d'une école Débuter en référencement 29 Mai 2015
Réduire le temps de chargement d'une page Développement d'un site Web ou d'une appli mobile 20 Mars 2015
réduire le poid d'une photo ( logiciel gratuit ) Développement d'un site Web ou d'une appli mobile 30 Janvier 2015
Réduire le temps de chargement - Besoin d'aide Développement d'un site Web ou d'une appli mobile 11 Août 2014
Réduire le temps de chargement d'un site. Développement d'un site Web ou d'une appli mobile 4 Septembre 2011
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice