php - 优化 SQL 查询
问题描述
我在非常简单的情况下遇到了有趣的问题。我在 MySQL 数据库中有帖子和用户表。帖子可以被用户喜欢。因此,有一个名为 likes 的单独表,其中包含列:user_id
, post_id
。
当用户点击应用程序中的like 按钮时,将执行对 php 脚本的请求。脚本正在检查表中是否存在 post_id 和 user_id 与请求中的信息匹配的行。用户对帖子的赞不能超过 1,如果我在已赞的帖子上按赞,以前的赞应该消失
我现在使用 2 个查询:1)检查表中是否存在 2)如果记录不存在 - 我正在添加它,如果存在,我将其删除。
现在我看到我的表中有来自同一用户的同一帖子的双重喜欢。似乎可以几乎立即执行来自单个用户的两个请求。
我该如何优化它 - 所以不可能在用户的一篇帖子中添加两个喜欢?我认为我需要运行单个查询,但它应该是什么?
解决方案
显然,您的插入/更新部分被多次触发。您应该调查为什么会发生这种情况,然后尽可能防止这种情况发生。
由于多次调用,DBMS 被多次询问条目是否存在。所有电话的答案是否定的。然后触发多个插入并且您得到重复。所以在 SQL 方面有两件事出错了:
- 为什么甚至可以为同一个帖子和用户插入多条记录?应该提供一个主键或唯一键以使这不可能。
我认为这对您的数据模型是强制性的。
- 动作顺序是错误的。一个可能的解决方案是先插入(一个会成功,其他会失败 - 当然提供了上面提到的密钥!),失败时会发出更新。然而,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;
推荐阅读
- python - 使用 Dash 制作带有 2 列和日期列的交互式条形图作为下拉列表?
- google-sheets - 如何将一些行转置为列?
- android - 使用 Android 的 ConstraintLayout 设置两个视图之间的最大间距
- cython - Cythonized python.net 代码找不到系统程序集
- python - 设置 setuptools 以创建带有可用标头的 cimportable 包
- xcode - 当应用程序在 xcode 中崩溃时,如何获取错误消息而不是在断点处停止?
- python - 如何修复此错误“AttributeError:模块'socket'没有属性'gethostname'”
- python - df.set_index=("Neighbourhood",inplace=True) 给我 SyntaxError: invalid syntax
- passwords - 串行自哈希的漏洞
- angular - 具有多个观察者的 Rxjs 主题和去抖动仅订阅最后一个