2012-12-10 85 views
0

我有一個項目,我目前的工作,建在PHP MySQL的&一個問題。該項目本身與在線投標系統類似。用戶對一個項目進行出價,如果他們通過點擊並再次登錄,他們就有機會贏得競標。MySQL和UNIX_TIMESTAMP插入錯誤

問題是這樣的:如果5個用戶同時進入遊戲,我會在數據庫中得到8-10秒的延遲 - 我使用UNIX_TIMESTAMP(CURRENT_TIMESTAMP)更新數據庫,這使得整個系統的投標沒用。

我想提一下,該項目是非常密集的數據庫(每頁大約30-40查詢),我想也許查詢延遲,但我不知道這是否發生。如果是這樣的話,有什麼建議如何避免這種類型的問題?

希望我一直在這個問題至少清楚。這是第一次發生在我身上,我會感謝你的幫助!

+0

你的問題是有點含糊,但它聽起來像你有你需要優化一些運行較慢的查詢。您可能想要使用慢查詢日誌。 http://dev.mysql.com/doc/refman/5.1/en/slow-query-log。html –

+1

爲什麼不計算PHP中的當前時間戳並將其插入到數據庫中?那麼數據庫滯後並不重要。 –

+2

這非常含糊。請用一些代碼來支持你的問題。 – Kermit

回答

0

您可以在

  1. 優化或減少所需的查詢決定。
  2. 您可以在每次訪問時緩存不需要更新的查詢。
  3. 您可以使用總結表
  4. 僅更新查詢。

你必須巧妙地做到這一點。你可以關注這個MySQL性能博客

0

我不清楚你在做什麼,但讓我詳細說明你的意思。如果你在MySQL查詢中使用UNIX_TIMESTAMP(CURRENT_TIMESTAMP()),那麼你有一個嚴重的問題。

您的方法存在的問題是您正在使用MySQL函數提供將存儲在數據庫中的時間戳記錄。這是一個問題,因爲那樣你必須等待MySQL解析並執行你的查詢,然後纔會生成時間戳(並且MyISAM等一些MySQL引擎使用表級鎖定)。其他引擎(如InnoDB)由於行級鎖定粒度而寫入速度較慢。這意味着存儲在行中的時間不一定會反映生成請求的時間以插入所述行。此外,它也可能意味着你從數據庫中讀取的時間不一定是最當前記錄(假設你正在更新記錄它們插入到表後)。

您需要的是生成SQL查詢以直接在SQL查詢中提供TIMESTAMP的PHP請求。這意味着時間戳反映了PHP收到請求的時間,而不一定是該行插入/更新到數據庫中的時間。

你也必須清楚哪些MySQL的引擎你的表使用。例如,像InnoDB的引擎使用MVCC的多版本並行控制)。這意味着當一行正在被讀取時,它可以被同時寫入。如果發生這種情況,數據庫引擎會使用稱爲頁面表的東西來存儲客戶端在讀取新值時更新的現有值。這樣你就可以保證行級鎖定的速度更快,讀取更穩定,但寫入速度可能會更慢。