首页 > 解决方案 > 优化 SQL 查询

问题描述

我在非常简单的情况下遇到了有趣的问题。我在 MySQL 数据库中有帖子和用户表。帖子可以被用户喜欢。因此,有一个名为 likes 的单独表,其中包含列:user_id, post_id

当用户点击应用程序中的like 按钮时,将执行对 php 脚本的请求。脚本正在检查表中是否存在 post_id 和 user_id 与请求中的信息匹配的行。用户对帖子的赞不能超过 1,如果我在已赞的帖子上按赞,以前的赞应该消失

我现在使用 2 个查询:1)检查表中是否存在 2)如果记录不存在 - 我正在添加它,如果存在,我将其删除。

现在我看到我的表中有来自同一用户的同一帖子的双重喜欢。似乎可以几乎立即执行来自单个用户的两个请求。

我该如何优化它 - 所以不可能在用户的一篇帖子中添加两个喜欢?我认为我需要运行单个查询,但它应该是什么?

标签: phpmysqlsqlquery-optimization

解决方案


显然,您的插入/更新部分被多次触发。您应该调查为什么会发生这种情况,然后尽可能防止这种情况发生。

由于多次调用,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;

推荐阅读