簡體   English   中英

優化SQL查詢

[英]Optimize SQL queries

在非常簡單的情況下,我遇到了有趣的問題。 我在MySQL數據庫中有帖子和用戶表。 帖子可以被用戶喜歡。 因此,有一個單獨的表,稱為Likes,該表具有以下列: user_idpost_id

當用戶在應用程序中點擊“ like”按鈕時,將執行對php腳本的請求。 腳本正在檢查表中是否存在post_id和user_id與請求信息匹配的行。 用戶對一個帖子的贊不能超過1個,並且如果我在已經喜歡的帖子上按贊,則以前的贊應該消失

我現在使用2個查詢:1)檢查是否存在表2)如果記錄不存在-我正在添加它,如果存在,則將其刪除。

現在,我的表格中出現了來自同一用戶的相同帖子的重復贊。 似乎單個用戶的兩個請求幾乎可以立即執行。

我如何優化它-因此不可能在用戶的一篇文章中添加兩個贊? 我認為我需要改為運行單個查詢,但是應該是什么呢?

顯然,您的插入/更新部件被多次觸發。 您應該調查為什么會發生這種情況,然后盡可能避免這種情況。

由於有多個調用,因此多次詢問DBMS是否存在該條目。 對於所有電話,答案是否定的。 然后觸發多個插入,您將獲得重復。 因此,在SQL方面,有兩件事出錯了:

  1. 為什么甚至可以為同一帖子和用戶插入多個記錄? 應該提供主鍵或唯一鍵,以使其不可能。

我認為這對於您的數據模型是必不可少的。

  1. 動作順序是錯誤的。 可能的解決方案是先插入(一個將成功,其他將失敗-當然提供了上述密鑰!),並且在失敗時將發布更新。 但是,MySQL甚至可以一步一步實現:

使用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的列),並更新該值而不刪除整個行。

您的步驟應如下:

  1. 檢查行是否存在。
  2. 如果存在,則更新列(如-1,與-0不同)

而已。

在模板中檢查0或1是否與眾不同

暫無
暫無

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

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