2010-10-02 6 views
0

Je suis en train de structurer mes requêtes pour un modèle de mise à jour de base de données avec CodeIgniter.Performances de base de données avec des requêtes de mise à jour en boucle?

j'obtenir le formulaire affiché des touches d'entrée avec $keys = array_keys($_POST)

Pour mettre à jour les champs de base de données selon je voulais faire quelque chose comme ça

foreach($keys as $key){ 
    $data = $this->input->post($key); 
    $this->db->query("Update $table SET '$key'='$data' WHERE user_id='$the_user->id'"); } 

(ce n'est pas le code de production, juste essayer d'illustrer ma question , donc pas d'échappement, validation, etc ...)

Ma question est, est-ce que cela pose un problème de performance en exécutant une requête séparée pour chaque élément de données de formulaire soumis?

EDIT: désolé n'a pas l'intention de sonner comme une question oui ou non, évidemment si oui ou non, la réponse est oui, mais je cherche plus de dans quelle mesure cela entrave la performance?

Répondre

0

Oui.

Vous publiez plusieurs mises à jour au lieu d'une seule. L'impact sur les performances est moins susceptible d'être dans votre boucle php, et plus dans la connexion à la base de données; Ainsi, la réduction du nombre de transactions entre votre application et la base de données améliorera les performances.

Vous pouvez essayer:

  1. construire votre chaîne SQL avant de soumettre:

    UPDATE <table> SET key1=data1, key2=data2, key3=data3 WHERE user_id=<user> 
    
  2. exécuter plusieurs mises à jour dans la même transaction:

    $this->db->query(" 
        UPDATE <table> SET key1=data1 WHERE user_id=<user>; 
        UPDATE <table> SET key2=data2 WHERE user_id=<user>; 
        UPDATE <table> SET key3=data3 WHERE user_id=<user>;" 
    ); 
    

Je Je ne sais pas comment PHP/MySQL handl e la deuxième option. Perl/Postgres peut le faire. En outre, je pense que la première option serait plus rapide.

Une autre chose à considérer, si vous faites cela pour plusieurs utilisateurs, est d'utiliser un IN (par exemple WHERE user_id IN ($user_list), où user_list de $ est une chaîne d'utilisateurs dans le format 'user1','user2','user3').

+0

mise à jour question pour refléter mes espoirs de la réponse, désolé, je n'étais pas clair avant. – user48202

+1

L'impact sur les performances dépend du nombre de paires clé/valeur, du nombre de requêtes en cours d'exécution, de la taille des tables, etc. Si vous exécutez seulement 5 requêtes, cela devrait être presque instantané. Le plus grand impact sur les performances serait de s'assurer que le champ 'user_id' est indexé. – vol7ron

+0

Comme vous l'avez dit, ce n'est pas du code de production, donc si votre requête est plus avancée (jointures multiples), alors vous voudrez vraiment réduire le nombre de requêtes soumises (option 1). – vol7ron

Questions connexes