簡體   English   中英

MySQL更新或插入帶有多個查詢的整數值以同時更改它

[英]MySQL Update or Insert an integer value with multiple queries to change it at same time

我在MySQL表中有一個整數列,想要向其中添加一個或從中減去一個(稱為點系統)。

AFAIK的兩個選項是更新表中單行的int列,或每當發生如下所示的更改時插入新行。

id | int
1  | 5
2  | 4
3  | 5
4  | 6

我不確定該選擇哪個,因為可能有許多用戶正在發送查詢來更改此數字,所以我不希望查詢添加或減去一個歷史數字。

哪一種是更好的方法,或者還有我還沒有考慮過的更好的方法? (通過“更好”,我的意思是在嘗試添加/減去該值的大量查詢的壓力下失敗的可能性較小)。 我聽說過有關鎖定和事務的信息,但是不確定如何在這個簡單的系統中實現它們,我相信很多解決此問題的應用程序都已解決。

謝謝。

這更多是評論而不是答案。

您沒有提供足夠的信息來真正回答問題。 關鍵是如何使用結果。

將記錄插入表中通常比更新記錄更快,因為SQL引擎不需要首先搜索記錄。 當然,如果您在表上有索引和唯一約束,則情況會變得更加復雜。

另一方面,如果您需要知道總值,則將表中的值相加會花費時間。

因此,平衡實際上是您增加的頻率與查看總和的頻率之間。 如果您從不查看總和,則insert操作可能會更快。 不過,總的來說,我傾向於更新值。

我認為更新id的整數值將是處理此問題的正確方法。 由於顯然您不希望在石頭查詢中使用這樣的集合,因此有多個請求可能同時更新整數值,如下所示:

UPDATE pointstable SET int = 7 WHERE id = '4';

相反,您希望查詢執行如下數學增量:

UPDATE pointstable SET int = (int + 1) WHERE id = '4';

對於簡單的情況,您可以使用MySQL MyISAM引擎並使用表鎖定進行並發-鎖定非常快。 除非您像一百萬人一樣嘗試更新計數器,否則可伸縮性就不會成為問題

所以算法是

當用戶希望修改號碼時,您可以這樣做

LOCK TABLES pointstable WRITE; 
UPDATE pointstable SET int = (int + 4) WHERE id = 3;
UNLOCK TABLES; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM