2011-10-09 95 views
0

我正在开发一个使用zend框架的web应用程序,问题是关于组合2个sql查询以提高效率。我的表结构是这样的用一个查询插入两个表

>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' 

要获取该代码的工作,我第一次插入邮件正文和时间信息表,然后利用最后插入的ID,我将消息发送者和接收者MESSAGE_MAP表。现在我想要做的是在单个查询中执行此任务,因为使用一个查询会更高效。有没有办法做到这一点。

+4

如果这是关于一个或两个查询(而不是一次运行数千个查询),那么您可能会浪费您的时间来优化它。 –

+0

一个查询只是一个示例,实际上这个查询会在循环中使用,可能是数千次。我只想学习优化我的整个代码的技巧。 – Sourabh

+0

够公平的。然而,我认为在这种情况下,没有办法使用两个查询。 –

回答

1

不,没有。您只能一次插入一个表格。

但我无法想象你需要插入如此多的消息,性能真的成为一个问题。即使使用这些单独的语句,任何数据库都可以轻松地每分钟插入数千条记录。

批量插入
当然,在相同表中插入多条记录的时候,那是另一回事。这在MySQL中确实是可能的,它会使你的查询更快。但是,如果您需要从所有这些记录中插入id,它会给您带来麻烦。

mysql_insert_id()返回插入最后的INSERT语句中的第一个ID,如果是批量插入。所以你可以查询所有id>的那个id。它应该为您提供您刚插入的所有记录,尽管结果可能包含其他人在您的插入和这些ID的以下查询之间插入的其他人。

+0

在处理严肃的项目时,性能始终是一个问题。我试图找到可以提高应用程序性能的所有方法。 – Sourabh

+0

@Sourabh是的,当使用IGNORE或DELAYED等一些选项(取决于您的代码)使用单独的INSERT时性能会更好,因此您将并行INSERT插入到两个不同的表中。 – RReverser

0

如果只有这两个表。你为什么不一个作为

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

那么它会像你所希望的方式创建拥有所有这些列一个表。

+0

如果我这样做,我不能这样做,当用户将一个消息发送给多个接收者时,整个消息将被一次又一次地复制给每个接收者。 – Sourabh

0

我同意GolezTrol或以其他方式,如果你想为你的查询优化的性能或许你可以选择使用存储过程

0

事实上这两种刀片组合将是不可能的。当您使用JOIN获取查询时,无法组合插入查询。如果你真的担心表演,是不是有加入这两张表的共同之处?据我所知,把他们分开是没有意义的。这两个关于消息。 如前所述,顺便说一句,执行第二个插入查询并不是那么多的服务器负载。

0

正如其他人指出的,你不能一次真正更新多个表。而且,除非您在短时间内插入数千条消息,否则您不应该担心性能。

现在,您可以担心一件事。试想一下,您首先插入邮件正文,然后尝试插入收件人/发件人ID。假设第一次成功,而第二次(无论出于何种原因)失败。这会损坏你的数据。为了避免这种情况,您可以使用交易,例如

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

这将确保两个插入都进入数据库,或两者都不。如果您正在使用PDO,请查看http://www.php.net/manual/en/pdo.begintransaction.php的示例。

相关问题