2012-06-01 24 views
0

存儲數據...我已經尋找已經是幾個小時,但已經找到關於這個問題罷了。mysql_data_seek與在陣列

我正在開發一個網站,依賴於一個查詢定義必須在頁面上加載的元素。但是爲了組織數據,我必須重複這個查詢的結果4次。

在第一次嘗試,我開始使用mysql_data_seek,所以我可以再經過查詢,但我開始失去表現。由於這個原因,我嘗試交換mysql_data_seek將數據放入數組並運行foreach循環。

的表現並沒有以任何方式,我可以衡量的提高,所以我就開始琢磨這,其實是最好的選擇。建立一個相當大的數據數組,執行多次mysql_fetch_array。

我的應用程序目前正在與PHP 5.2.17,MySQL和一切運行在本地主機。不幸的是,我有一個繁忙的數據庫,但從來沒有任何連接數量的問題。

有沒有執行這個任務的一些可取的方法?除了mysql_data_seek或大數組數據之外,還有其他選項嗎?有沒有人有關於這些選項的基準測試的一些信息?

非常感謝您的時間。

+0

我不知道mysql庫的確切實現,但我相信當你運行一個返回結果的查詢時,它將整個結果存儲在一個數組中。如果是這樣的話,自己將它存儲在一個數組中真的沒有任何性能提升。 –

回答

1

您的問題的答案可能在於爲數據庫中的適當字段建立索引,大多數數據庫也會頻繁提供查詢,但是一旦他們的表被更改,它們往往會拋棄它們。 (這是有道理的)

所以你可以相信你的數據庫做它做得很好:查詢和檢索數據,並通過確保表中幾乎沒有爭用和/或放置適當的indexes來幫助它。這反過來可以改變寫作的表現,這對你而言可能並不重要,只有你真的可以判斷。 (索引必須計算並保留)。

你使用,將發揮作用,以及,如果速度是最重要的PHP擴展:「升級」到mysqlipdo,做一個 - >fetch_all(),因爲這將減少PHP進程之間的通信數據庫服務器。對此的唯一原因是,如果您查詢的數據量非常巨大,以至於通過將其強制轉換爲交換,它會阻止或阻止您的php/webserver進程或整個服務器。

您使用的表類型可能很重要,某些類型的查詢似乎在MYISAM上運行得更快,而不是INNODB。如果你想重新工作一下,那麼你可以在mysql的HEAP engine中存儲這些數據(或它的一個副本),所以就在內存中。儘管如果你想保持修改過的數據,你需要小心地將它與磁盤上的寫入同步。 (只是在服務器發生故障或關機的情況下)

或者,您可以將數據緩存在類似memcache或使用apc_store,這應該是非常快的,因爲它在php進程內存中。這裏需要注意的一點是,APC通常只有較少的內存可用於存儲(默認值爲32MB)Memcache的最大優點是雖然仍然很快,但它是分佈式的,所以如果你有多個服務器在運行,他們可以共享這些數據。

您可以嘗試一個nosql數據庫,最好只是一個密鑰存儲區,甚至不是文檔存儲區,例如redis

最後你可以在你的php腳本中硬編碼你的值,確保仍然使用類似eaccelerator或APC的東西,並驗證你是否真的需要使用它們4次,或者你不能緩存任何它的輸出你實際上是用它創造的嗎?

所以我很抱歉,我不能給你一個現成的答案,但適用時的表現問題通常需要多管齊下的方法。 : - |

+0

感謝您的快速響應。 我想將查詢編譯成php腳本,就像你提到的那樣,但是,不幸的是,我需要很多時間才能使它像現在一樣整潔和動態地工作。 我會盡力研究你所做的一些觀點。 非常感謝。謝謝。 –