用一个查询插入两个表
我正在开发一个使用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表。现在我想要做的是在单个查询中执行此任务,因为使用一个查询会更高效。有没有办法做到这一点。
不,没有。您只能一次插入一个表格。
但我无法想象你需要插入如此多的消息,性能真的成为一个问题。即使使用这些单独的语句,任何数据库都可以轻松地每分钟插入数千条记录。
批量插入
当然,在相同表中插入多条记录的时候,那是另一回事。这在MySQL中确实是可能的,它会使你的查询更快。但是,如果您需要从所有这些记录中插入id,它会给您带来麻烦。
mysql_insert_id()返回插入最后的INSERT语句中的第一个ID,如果是批量插入。所以你可以查询所有id>的那个id。它应该为您提供您刚插入的所有记录,尽管结果可能包含其他人在您的插入和这些ID的以下查询之间插入的其他人。
如果只有这两个表。你为什么不一个作为
>table message
id(int auto incr)
body(varchar)
sender(int) comment 'user id of sender'
receiver(int) comment 'user id of receiver'
time(datetime)
那么它会像你所希望的方式创建拥有所有这些列一个表。
如果我这样做,我不能这样做,当用户将一个消息发送给多个接收者时,整个消息将被一次又一次地复制给每个接收者。 – Sourabh
我同意GolezTrol或以其他方式,如果你想为你的查询优化的性能或许你可以选择使用存储过程
事实上这两种刀片组合将是不可能的。当您使用JOIN获取查询时,无法组合插入查询。如果你真的担心表演,是不是有加入这两张表的共同之处?据我所知,把他们分开是没有意义的。这两个关于消息。 如前所述,顺便说一句,执行第二个插入查询并不是那么多的服务器负载。
正如其他人指出的,你不能一次真正更新多个表。而且,除非您在短时间内插入数千条消息,否则您不应该担心性能。
现在,您可以担心一件事。试想一下,您首先插入邮件正文,然后尝试插入收件人/发件人ID。假设第一次成功,而第二次(无论出于何种原因)失败。这会损坏你的数据。为了避免这种情况,您可以使用交易,例如
mysql_query("START TRANSACTION", $connection);
//your code
mysql_query("COMMIT", $connection);
这将确保两个插入都进入数据库,或两者都不。如果您正在使用PDO,请查看http://www.php.net/manual/en/pdo.begintransaction.php的示例。
如果这是关于一个或两个查询(而不是一次运行数千个查询),那么您可能会浪费您的时间来优化它。 –
一个查询只是一个示例,实际上这个查询会在循环中使用,可能是数千次。我只想学习优化我的整个代码的技巧。 – Sourabh
够公平的。然而,我认为在这种情况下,没有办法使用两个查询。 –