2011-10-09 7 views
0

Je développe une application web en utilisant zend framework et le problème consiste à combiner des requêtes de 2 sql pour améliorer l'efficacité. Ma structure de table est comme ceInsertion dans deux tables avec une seule requête

>table message 
id(int auto incr) 
body(varchar) 
time(datetime) 

>table message_map 
id(int auto incr) 
message_id(forgain key from message table's id column) 
sender(int) comment 'user id of sender' 
receiver(int) comment 'user id of receiver' 

Pour obtenir le code de travail, je suis d'abord insérer le corps du message et le temps à la table de message, puis en utilisant le dernier id Inséré, je l'insertion de l'expéditeur du message et le récepteur à message_map tableau . Maintenant, ce que je veux faire est de faire cette tâche dans une seule requête car l'utilisation d'une requête sera plus efficace. Y a-t-il un moyen de le faire?

+4

Si cela concerne environ une ou deux requêtes (et non des milliers qui s'exécutent en même temps), vous perdez probablement votre temps à essayer d'optimiser cela. –

+0

Une requête est juste un échantillon, en fait cela va être utilisé dans une boucle, probablement des milliers de fois. Je veux juste apprendre l'astuce pour optimiser mon code entier. – Sourabh

+0

assez juste. Je pense cependant que dans ce cas, il n'y a aucun moyen d'utiliser deux requêtes. –

Répondre

1

Non, il n'y en a pas. Vous pouvez insérer dans une seule table à la fois.

Mais je ne peux pas imaginer que vous deviez insérer autant de messages que la performance devient vraiment un problème. Même avec ces instructions distinctes, n'importe quelle base de données peut facilement insérer des milliers d'enregistrements par minute.

vrac insère
Bien sûr, lors de l'insertion de plusieurs enregistrements dans la même table , qui est une autre affaire. C'est en effet possible dans MySQL et cela rendra votre requête beaucoup plus rapide. Cependant, cela vous donnera des problèmes si vous avez besoin d'insérer insert_ids de tous ces enregistrements. Mysql_insert_id() renvoie le premier identifiant qui est inséré dans la dernière instruction d'insertion, s'il s'agit d'une insertion en bloc. Vous pouvez donc interroger tous les identifiants qui sont> = cet identifiant. Il devrait vous donner tous les enregistrements que vous venez d'insérer, bien que le résultat puisse contenir des identifiants que d'autres personnes ont insérés entre votre insertion et la requête suivante pour ces identifiants.

+0

tout en travaillant avec des projets sérieux, la performance est toujours un problème. J'essaie de trouver toutes les façons dont je peux améliorer les performances de mon application. – Sourabh

+0

@Sourabh Oui, et les performances sont meilleures quand on utilise des INSERT séparés avec des options comme IGNORE ou DELAYED (cela dépend de votre code) donc vous aurez INSERT parallèle dans deux tables différentes. – RReverser

0

si c'est seulement pour ces deux tables. Pourquoi ne pas créer une seule table ayant toutes ces colonnes dans un comme

>table message 
id(int auto incr) 
body(varchar) 
sender(int) comment 'user id of sender' 
receiver(int) comment 'user id of receiver' 
time(datetime) 

alors ce sera comme vous le souhaitez.

+0

Je ne peux pas bcoz si je le fais de cette façon, quand un utilisateur enverra un message à plusieurs destinataires, le message entier sera copié encore et encore pour chaque récepteur. – Sourabh

0

Je suis d'accord avec GolezTrol ou autrement si vous voulez une performance optimisée pour votre requête peut-être vous pouvez choisir d'utiliser les procédures stockées

0

En effet la combinaison de ces deux inserts ne serait pas possible. Pendant que vous utilisez van dans les requêtes get, vous ne pouvez pas combiner les requêtes d'insertion. Si vous vous inquiétez vraiment des performances, n'y a-t-il pas lieu de joindre ces deux tables ensemble? Pour autant que je puisse voir, il ne sert à rien de les séparer; là à la fois sur le message. Comme indiqué précédemment, l'exécution d'une deuxième requête d'insertion n'est pas une grande partie de la charge d'un serveur.

0

Comme d'autres l'ont souligné, vous ne pouvez pas vraiment mettre à jour plusieurs tables à la fois. Et vous ne devriez pas vraiment vous inquiéter des performances, sauf si vous insérez des milliers de messages dans un court laps de temps.

Maintenant, il y a une chose qui pourrait vous inquiéter. Imaginez, vous insérez d'abord le corps du message, puis essayez d'insérer les ID récepteur/expéditeur. Supposons que le premier réussisse, tandis que le second (pour une raison quelconque) échoue. Cela corromprait vos données un peu. Pour éviter cela, vous pouvez utiliser des transactions, par ex.

mysql_query("START TRANSACTION", $connection); 
//your code 
mysql_query("COMMIT", $connection); 

Cela garantirait que les deux insertions se retrouvent dans la base de données, ou pas. Si vous utilisez PDO, recherchez des exemples dans http://www.php.net/manual/en/pdo.begintransaction.php.

Questions connexes