[英]Optimize SQL queries
在非常簡單的情況下,我遇到了有趣的問題。 我在MySQL數據庫中有帖子和用戶表。 帖子可以被用戶喜歡。 因此,有一個單獨的表,稱為Likes,該表具有以下列: user_id
, post_id
。
當用戶在應用程序中點擊“ like”按鈕時,將執行對php腳本的請求。 腳本正在檢查表中是否存在post_id和user_id與請求信息匹配的行。 用戶對一個帖子的贊不能超過1個,並且如果我在已經喜歡的帖子上按贊,則以前的贊應該消失
我現在使用2個查詢:1)檢查是否存在表2)如果記錄不存在-我正在添加它,如果存在,則將其刪除。
現在,我的表格中出現了來自同一用戶的相同帖子的重復贊。 似乎單個用戶的兩個請求幾乎可以立即執行。
我如何優化它-因此不可能在用戶的一篇文章中添加兩個贊? 我認為我需要改為運行單個查詢,但是應該是什么呢?
顯然,您的插入/更新部件被多次觸發。 您應該調查為什么會發生這種情況,然后盡可能避免這種情況。
由於有多個調用,因此多次詢問DBMS是否存在該條目。 對於所有電話,答案是否定的。 然后觸發多個插入,您將獲得重復。 因此,在SQL方面,有兩件事出錯了:
我認為這對於您的數據模型是必不可少的。
使用ON DUPLICATE KEY
:
insert into likes (post_id, user_id, like_date)
values (@post_id, @user_id, current_date)
on duplicate key update like_date = current_date;
使用InnoDB,然后
START TRANSACTION;
SELECT ... FOR UPDATE;
if it does not exist
INSERT ...;
else
DELETE ...
COMMIT;
通過使用事務語義,可以避免多個連接彼此踩踏的任何問題。 我想我什至避免了任何僵局。
只需使用一個標志(值為0或1的列),並更新該值而不刪除整個行。
您的步驟應如下:
而已。
在模板中檢查0或1是否與眾不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.