2011-06-15 33 views
0

我想將2個現有的MySQL MyISAM表合併成一個使用PHP的新表。這裏是我的PHP代碼:在PHP中創建大型MySQL表時產生巨大的延遲

$sql = "CREATE TABLE new_table SELECT * FROM table_1 UNION SELECT * FROM table 2"; 
mysql_query("$sql"); 

注意:表格相當大,有超過3000萬條目。

所以我在瀏覽器中打開PHP文件,以便它執行腳本。我用phpmyadmin監控數據庫,起初絕對沒有任何反應。然後在大約30分鐘後,表格「new_table」顯示出裏面的所有正確數據。

PHP緩衝或緩存「new_table」直到它完成,然後在MySQL中創建它?如果是這樣,有沒有辦法告訴php不要?恐怕如果是這樣的話,一旦表格達到數十億行,當我嘗試複製它時,它將不再適合緩衝區。

有誰知道如何讓PHP立即執行查詢而無需緩衝或緩存延遲?

我試過mysql_unbuffered_query(「$ sql」);並且仍然有巨大的延遲。

任何幫助將不勝感激!

+2

我不認爲PHP會和它有很大關係。 – alex 2011-06-15 02:14:55

+0

你應該在'start transaction'中包裝'create table'調用;創建表...;提交;'阻止。 – 2011-06-15 02:18:15

+2

你不是簡單地從SQL命令行執行此操作的任何原因? – 2011-06-15 02:25:09

回答

0

在創建表的過程中在另一個MySQL查詢中發出show processlist;,您將看到發生了什麼。

+0

好吧,我檢查了進程列表,它說「將HEAP轉換爲MyISAM」大約10秒鐘,然後「發送數據」大約20分鐘。 – 2011-06-15 03:02:33

0

這與更多的數據量 - 3000萬條記錄 - 以及您創建表的方式有關 - CREATE TABLE通過SELECTUNION

問題是,這可能是最慢的你可以做到這一點。從命令行運行此查詢,前CREATE TABLE +批INSERT INTO應該都更快。

我也建議尋找改變你的表的存儲引擎。 MyISAM可能會因大記錄而降級,並具有其他性能方面的考慮因素。您應該考慮其他人,如InnoDB,具體取決於您的數據庫交互。閱讀更多about MyISAM versus InnoDB

+0

感謝您的快速響應。我將如何通過命令行批量插入表中?從2個現有表創建我的表後,100%的查詢將是讀取和寫入,所以我認爲MyISAM仍然是一條路。 – 2011-06-15 02:53:48

+0

最好退後一步,實際描述你想要做的事情。至於存儲引擎,我不是MySQL DBA,所以我不會質疑最後一部分。 – 2011-06-15 03:34:40