2010-01-24 17 views
3

J'écris une application php-mysql. L'application permet à l'utilisateur d'exécuter une recherche sur la base de données. Lorsque la recherche est lancée, si l'utilisateur clique sur le bouton de retour pour y revenir après avoir examiné un élément signalé, il lui est demandé s'il souhaite renvoyer la requête (il utilise la publication). Ce qui relancerait la recherche dans la base de données. L'utilisation de get n'entraînerait pas la demande de repost - mais elle réexécuterait la recherche.PhP/MySQL Stockage des recherches d'utilisateurs entre les pages pour que l'utilisateur puisse y retourner

Existe-t-il un moyen de stocker la recherche et de la rappeler, sans la réexécuter dans la base de données?

Cela peut être l'enregistrement dans la base de données, ou en quelque sorte dans le php - peut-être avec des sessions? Il peut y avoir beaucoup de données provenant de ces recherches, j'ai l'impression que c'est probablement trop pour les sessions.

L'autre façon que je peux imaginer est de le stocker dans la base de données, dans une sorte de table temporaire. Création de la table avec les colonnes que j'ai l'intention d'interroger, puis sélection dans une insertion. Ensuite, en sélectionnant * dans le tableau. Cela semble aussi plutôt une mauvaise idée. Beaucoup de tables temporaires créées dynamiquement flottant.

Je sais que cela peut être fait. Les recherches enregistrées sont ce que vous voyez dans de nombreuses applications Web. Alors, comment cela se passe-t-il généralement?

+0

Cette question pourrait également vous intéresser: http://stackoverflow.com/questions/2020344/smart-database-cache –

Répondre

2

memcached

ou

APC

Cependant, je remarque que vous ne donnez aucune raison pourquoi vous voulez mettre en cache les résultats d'une recherche. "Parce que c'est plus rapide, et j'ai lu que ça rend mon application plus évolutive", explique-t-on. Cela sent l'optimisation prématurée.

Je vous recommande de créer votre application et de la profiler. Combien coûtent ces "recherches"? Pourquoi sont-ils coûteux? Est-ce la mauvaise conception de schéma? Est-ce une mauvaise indexation? Est-ce un mauvais choix de moteur de stockage?

Vous vous rendez compte que MySQL a un query cache, non? Dans de nombreux cas, cela peut être tout ce dont vous avez besoin. Essayez d'exécuter l'une de vos requêtes "search" coûteuses en utilisant le client mysql et notez l'heure, puis réexécutez-la. Voir?

+0

Je ne savais pas vraiment que MySQL avait un cache de requête. Je m'enseigne PHP et mysql comme je vais. Bon à savoir, je vais essayer et voir comment ça se passe. –

+0

Désolé pour le retard dans l'acceptation, a pris un moment pour moi de se déplacer pour tester cela. –

2

pour fixer la « voulez-vous resoumettre » erreur, vous pouvez enregistrer la demande dans la session ou dans la db, puis rediriger immédiatement vers une nouvelle page pour effectuer réellement la recherche:

search.php?searchId=22 

if (isset($_GET['searchId'])) { 
    $search = $_SESSION['search'][$_GET['searchId']; 
    // do search 
} elseif (isset($_POST['search'])) { 
    $_SESSION['search'][] = $_POST; 
    header('Location: search.php?searchId=' . (count($_SESSION['search']) - 1); 
} 

qui peut alors saisir les champs de requête de $ _SESSION ['search'] [22] ou le db ...

comme pour enregistrer les résultats, vous pouvez compter sur le cache du navigateur, ou vous pouvez stocker des SERPs individuels dans le session ou db ... expirant les anciens à un certain moment si nécessaire ...

cr manger une table de résultats est bien (et accélérerait la pagination sur des recherches complexes), mais vous pourriez potentiellement avoir des millions de hits là-dedans, donc une pagination avec la mise en cache serait plus générale.

Si l'utilisateur souhaite revenir à la recherche des jours ou des semaines plus tard, vous pouvez simplement réexécuter la recherche avec les champs de requête enregistrés.