2011-10-09 120 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的示例。

相關問題