2012-10-27 43 views
1

如何確定函數mysqli_multi_query(或mysqli_query)在PHP中收到的最大$查詢參數? 我有一個PHP程序,它生成一個由UPDATE sql命令組成的大字符串,由';'分隔問題是,如果該字符串超過了一定的長度,mysqli_query會生成一個錯誤,如'MySQL服務器已經消失'。我注意到這個長度似乎在1MB左右,但我怎麼能探測它,以便我可以確保我永遠不會超過這個長度?mysqli_query中的最大查詢長度

該腳本需要在25個左右的字段上運行大約7000次更新。一次執行一個更新證明非常慢,連接多個更新運行得更快。

任何運行多個查詢的可能性更快?

感謝您的任何建議!

+0

我認爲這不是字符串的長度,而是執行所有語句所需的時間。 – GolezTrol

+0

如果我運行它在phpmyadmin它運行在3秒內 –

+0

請再讀我的答案。我在接受我的文章後添加了一些關於「更快查詢」的內容。 – Kamil

回答

5

你應該看看MySQL錯誤日誌。

如果你沒有訪問機器(託管等),你可以問你的管理員或幫助臺的日誌。

MySQL支持非常大的查詢。林不知道是否有任何限制,但當你使用網絡 - 你可能有問題包大小

您可以在MySQL配置中檢查--max_allowed_packet,並嘗試設置更大的數據包大小。我不確定有關默認配置,但它可能是1MB,這可能是太小的價值,一次查詢7000更新。

MySQL可能需要更多的RAM來處理這樣的查詢。

如果你不能重新配置MySQL,你必須以某種方式將你的大查詢分割成更小的查詢。

你也可以看一下這更多信息:

​​

你問:

任何可能以更快的速度運行多個查詢?

這個問題沒有簡單的答案。這取決於查詢,數據庫模式等。

在配置文件中增加MySQL緩存大小在大多數情況下可能與很多簡單更新有關,但計算量不大,因爲數據庫引擎將在RAM內存上運行,而不是在硬盤上運行。當使用大緩存時 - 有時第一個大查詢可能會比較慢,因爲數據尚未加載到RAM中,但當它最終加載時 - 需要大量讀/寫操作的查詢將運行得更快。

後來補充: 我假設你的數據處理需求可能難以在純SQL實現PHP反序列化()函數,你必須這樣做在PHP :)如果你有機會到服務器控制檯可以創建cron(linux sheduler)作業,在夜間從shell調用PHP腳本。

稍後再添加 經過討論後,我有一個更多的想法。您可以從phpmyadmin製作完整數據庫或一個表的備份,下載它,恢復家庭計算機上的數據(在Windows上您可以使用XAMPP,WAMP服務器)。在家用電腦上,您可以運行mysql.exe並在本地處理數據。

+0

我想登錄訪問該網站,並使用第一個字段如ID,獲取,發佈,服務器,cookies的表。我在訪問時將這些序列化變量存儲在字段中。當我訪問日誌時,我反序列化(此時我運行那些7000 UPDATE)這些字段並將它們寫入輔助字段,如server_HTTP_REFERER,server_REMOTE_IP或post_page。我想導出表格並在電子表格中分析它 –

+0

我看到了。你可以重新配置該服務器嗎? – Kamil

+0

不幸的是沒有 –

0

我在INSERT語句中發現了16個字段/值對的限制。除此之外,我得到了一個「禁止」的錯誤。我在工作報告中的總INSERT語句長度爲392個字符。

0

使用for循環來執行任何大規模的工作,並使用常規的mysqli_query。我得到了超過16000個查詢來進入。有些東西也必須在php.ini文件中進行更改。後MB大小需要改變。如果您發送大量字符,請儘可能大。如果你發送很多不同的變量,var input max也應該改變。使php內存更大。確保在運行查詢時運行時不會耗盡系統內存。如果你一切正常,你可以發送超過20000個查詢。將php內存設置爲至少256mb。如果您發送真正的大量查詢,您可能需要將超時時間從30到60增加到200或更高。如果你不改變任何設置,即使一切正確,你的帖子也會失效。如果超出任何php.ini設置限制/最大值,PHP將使腳本條件爲false。你不必一個一個地改變任何mysql設置。如果您在1000個查詢中插入或更新任何內容,將需要一些時間。

+0

我無法看到你的問題在哪裏? – Jhecht