2013-04-08 27 views
0

我有一個上傳位置,因此用戶可以使用上傳的文件更新我的數據庫的一部分。這些文件通常高達9GB,因此插入150,000,000行可能需要幾分鐘的時間。使用PHP阻止多個MySQL訪問,但未鎖定MySQL

點擊網站上的按鈕更新數據庫後,PHP(使用mysqli)基本上進行了mysql鎖定。如果我打開其他選項卡,則在大型更新完成之前它們不會得到任何內容。 但是,我知道它實際上並沒有鎖定數據庫/表,因爲從CLI我仍然可以「SELECT count(*)FROM table」,它立刻給我一個結果。

什麼是最好的插入150,000,000條記錄,同時讓其他PHP頁面訪問數據庫的方法(只讀)?

+0

聽起來像阿帕奇工作人員的數量已經超出了,所以它掛在請求,直到有一個免費的工人? – cdhowie 2013-04-08 21:44:56

+0

將它移動到cronjob .. – 2013-04-08 21:49:54

+0

這不是簡單的Apache工作。創建另一個只是<?php echo'Test'?>的頁面立即打開。它只在訪問數據庫的頁面上遇到問題。 PHP在查詢運行時工作正常,MySQL在查詢運行時正常運行。這個問題似乎與MySQL + PHP組合有關。根據phpinfo(),mysqli.max_links被設置爲無限。我似乎無法弄清楚問題可能是什麼。 – 2013-04-09 15:13:38

回答

1

您可以使用「INSERT DELAYED」。 INSERT語句的DELAYED選項是標準SQL的MySQL擴展,如果您的客戶端不能或不需要等待INSERT完成,那麼它非常有用。當您使用MySQL進行日誌記錄時,這是一種常見情況,並且您還會定期運行需要很長時間才能完成的SELECT和UPDATE語句。

你可以在官方文檔here上閱讀這個資源。

;-)

+0

這聽起來合乎邏輯,但似乎沒有幫助。我想我有更多的PHP塊比MySQL塊。我已經可以從PHP以外的其他地方訪問MySQL了。有多少東西可以同時訪問數據庫有一個PHP或mysqli限制? – 2013-04-09 14:34:26

0

問題出在會議上。

由於上傳在會話中針對登錄進行了驗證,並且我在啓動db之前未能執行session_write_close(),因此會話文件在整個9GB讀寫數據庫時保持鎖定狀態。

這解釋了爲什麼我仍然可以使用CLI mysql和基本的PHP(我用來測試的基本PHP沒有會話)。