IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQLite] Optimiser de nombreuses recherches


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Par défaut [SQLite] Optimiser de nombreuses recherches
    Bonjour,
    Je me pose des questions d'optimisation :

    J'ai une table avec un champ texte "value".
    J'ai une chaine "pattern" à rechercher dans le champ "value" de la table.

    - Je cherche d'abord une entrée où value vaut exactement pattern.
    - Si je ne trouve pas je cherche une entrée où value vaut pattern, sans tenir compte de la casse.
    - Si je ne trouve toujours pas je cherche une entrée où value vaut pattern, sans tenir compte de la casse, et sans tenir compte d'un "s" final.

    Je dois faire cette recherche de multiples fois pour des pattern différents.

    Je me demande s'il est aussi rapide d'utiliser pour ces recherches les requêtes mysql, ou s'il est mieux de charger toute la table dans un tableau puis de gérer la recherche en php.

    Ce qui me fait me poser cette question, c'est que la bdd étant un fichier, je me dit que chaque requête va devoir accèder au fichier. Si je le fais en php les lectures se feront en mémoire donc ça pourrait aller plus vite.
    A moins qu'il y ait un système de cache qui fait que la dernière table lue reste en mémoire ?

    Si quelqu'un peut me renseigner, merci beaucoup.

    [edit] La table en question est une partie d'une application wiki, donc susceptible d'être accédée simultanément par plusieurs utilisateurs. Je le dis au cas où...

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par lilivounet Voir le message
    A moins qu'il y ait un système de cache qui fait que la dernière table lue reste en mémoire ?
    ça existe avec MySQL : si tu lance 10 fois la même requête, la 1re fois durera plus longtemps et ensuite le serveur cherchera automatiquement le résultat dans le cache pour les suivantes. ce cache est activé par défaut, il n'y a rien à configurer en règle générale

    Citation Envoyé par lilivounet Voir le message
    Je me demande s'il est aussi rapide d'utiliser pour ces recherches les requêtes mysql, ou s'il est mieux de charger toute la table dans un tableau puis de gérer la recherche en php.

    Ce qui me fait me poser cette question, c'est que la bdd étant un fichier, je me dit que chaque requête va devoir accèder au fichier. Si je le fais en php les lectures se feront en mémoire donc ça pourrait aller plus vite.
    si tu te poses des questions d'optimisation, cela veut dire que tu as déjà des grandes quantités de données.
    donc déjà il ne faut pas transférer toutes ces données de MySQL vers PHP puisque c'est souvent le transfert qui prend le plus de temps dans une requête. et ensuite PHP n'a souvent pas assez de mémoire à disposition pour tout stocker en mémoire vive

    ce que tu peux faire par exemple est de faire une requête qui cherche les 3 cas en même temps et à l'aide d'un IF de MySQL tu peux mettre des poids différents avec une requête de ce genre par exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *, IF(texte LIKE BINARY '%Voitures%', 4, IF(texte LIKE '%voitures%', 2, 1)) AS poids
    FROM table
    WHERE texte LIKE '%voiture%'
    ORDER BY poids DESC
    avec ça les lignes qui correspondront exactement à "Voitures" auront un poids de 4, sans test de la casse un poids de 2 et sans le "s" final un poids de 1

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Par défaut
    Merci beaucoup de ta réponse.

    Citation Envoyé par nosferapti Voir le message
    ça existe avec MySQL : si tu lance 10 fois la même requête, la 1re fois durera plus longtemps et ensuite le serveur cherchera automatiquement le résultat dans le cache pour les suivantes. ce cache est activé par défaut, il n'y a rien à configurer en règle générale
    Dans mon cas il ne s'agit pas de la même requête, mais d'une requête similaire portant sur la même table. Ça va marcher aussi ?

    Citation Envoyé par nosferapti Voir le message
    si tu te poses des questions d'optimisation, cela veut dire que tu as déjà des grandes quantités de données.
    donc déjà il ne faut pas transférer toutes ces données de MySQL vers PHP puisque c'est souvent le transfert qui prend le plus de temps dans une requête. et ensuite PHP n'a souvent pas assez de mémoire à disposition pour tout stocker en mémoire vive
    Je n'en suis pas vraiment à de "grandes quantités" je crois. Disons que ma table devrais avoir dans les 300 lignes. J'ai aussi d'autres choses à faire avec une table de 5000 lignes.

    Citation Envoyé par nosferapti Voir le message
    ce que tu peux faire par exemple est de faire une requête qui cherche les 3 cas en même temps et à l'aide d'un IF de MySQL tu peux mettre des poids différents avec une requête de ce genre par exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *, IF(texte LIKE BINARY '%Voitures%', 4, IF(texte LIKE '%voitures%', 2, 1)) AS poids
    FROM table
    WHERE texte LIKE '%voiture%'
    ORDER BY poids DESC
    avec ça les lignes qui correspondront exactement à "Voitures" auront un poids de 4, sans test de la casse un poids de 2 et sans le "s" final un poids de 1
    Merci pour ça. Je débute en SQL et ça m'aiguille beaucoup.
    Le problème c'est que ma table est du style :

    ------------------------------------------------------------
    categorie | mots
    ------------------------------------------------------------
    transport | voiture,véhicule,piste cyclable
    jeu | ballon,raquette,jeu de paume
    ------------------------------------------------------------

    Je veux obtenir le mot "transport" si le pattern est "voiture" ou "véhicule" ou "piste cyclable", mais pas "piste" tout seul.

    J'ai donc commencé à essayer REGEXP plutôt que LIKE mais le problème c'est que je suis avec SQLite, et que REGEXP n'y est pas implémenté par défaut, il doit y avoir une manip à faire. Je vais ouvrir un autre sujet là-dessus.

    Mais peut-être vois-tu comment si prendre sans REGEXP ?

    Sinon tu sembles donc dire qu'au niveau optimisation je n'ai pas de soucis à me faire. Pourrais-tu me le confirmer maintenant que j'en ai dit un peu plus ?

Discussions similaires

  1. [Cache] Optimisation page de recherche
    Par rad_hass dans le forum ASP.NET
    Réponses: 7
    Dernier message: 21/08/2009, 14h44
  2. Optimisation requete de recherche
    Par Greg84 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/08/2006, 09h29
  3. Optimisation d'une recherche et mise à jour
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/01/2005, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo