2010-02-16 70 views
2

如果你有100000個用戶,MySQL是否在執行一次SQL查詢?MySQL正在處理一個SQL查詢?

因爲在我的PHP代碼中,我檢查是否存在某個行;如果它不創建一個。如果是這樣,它只是更新行計數器。

它讓我想起了可能有100個用戶正在檢查該行是否同時存在以及它們是否全都創建一行。

如果MySQL正在按順序處理它們,我知道這不會是一個問題,那麼一個用戶會檢查它是否存在,如果不存在,創建它。另一個用戶將檢查它是否存在,並且由於這種情況,它只是更新計數器。

但是,如果他們都檢查它是否同時存在,並假設它不存在,那麼他們都創建一行,整個表結構將失敗。

如果有人能夠闡明這個話題,那將會很棒。

+0

請告訴我們你的代碼。 – SLaks

+1

MySQL是否提供了一種爲行生成唯一標識符的方法?如果你生成一個並用它作爲主鍵,你將不會得到重複。 –

+0

在我的情況下,它更像..「哪個用戶先得到」..第一個用戶將創建他的行,然後其他人將能夠創建自己的行。所以我必須去「檢查...如果它不存在...創建」 – ajsie

回答

2

使用UNIQUE約束,或者如果可行,使主鍵爲數據項之一,並且SQL服務器將阻止重複創建的行。如果行已經存在,甚至可以使用「ON DUPLICATE KEY UPDATE ...」語法來指定替代操作。

從您的意見,這聽起來像你可以使用USER_ID作爲主鍵,在這種情況下,你可以使用這樣的事情:

INSERT INTO usercounts (user_id,usercount) 
VALUES (id-goes-here,1) 
ON DUPLICATE KEY UPDATE usercount=usercount+1; 
1

如果您將支票和插入事務,那麼你可以避免這個問題。這樣,檢查和創建將作爲一個查詢運行,並且不應該有任何混淆。

+1

錯誤。事務也將並行運行,因此如果同時執行兩個事務將插入兩個不同的行。 – SLaks

+0

真的嗎?嗯,我沒有意識到這一點!感謝您指出這一點,我現在學到了一些東西,試圖回答一個問題... 我想我會在這裏留下我的「答案」,儘管如果有其他像我這樣的誤導靈魂在那裏。 –

+0

我甚至不知道交易是什麼=) – ajsie