优化sql查询

e7arh2l6  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(332)

我在一个非常简单的案例中遇到了一个有趣的问题。我在mysql数据库中有posts和users表。帖子可以被用户喜欢。所以有一个单独的表叫做likes,它有列: user_id , post_id .
当用户点击应用程序中的like按钮时,执行对php脚本的请求。脚本正在检查表中是否有post\u id和user\u id与请求中的信息匹配的行。用户对一个帖子不能有超过1个喜欢,如果我在已经喜欢的帖子上按like,以前的like应该会消失
我现在使用2个查询:1)检查like是否存在于表中2)如果记录不存在-我将添加它,如果存在,我将删除它。
现在我看到,在我的表中,同一个用户对同一个帖子有两个赞。似乎单个用户的两个请求几乎可以立即执行。
我如何优化它-这样就不可能添加两个喜欢从用户的一个职位?我认为我需要运行一个查询,但它应该是什么?

k4emjkb1

k4emjkb11#

只需使用一个标志(值为0或1的列),并在不删除整行的情况下更新该值。
步骤如下:
检查行是否存在。
如果存在,则更新列(如-1,与-0不同)
就这样。
在模板中,检查0或1的“不相似”和“相似”

agxfikkp

agxfikkp2#

显然,insert/update部件被多次激发。您应该调查为什么会发生这种情况,然后尽可能防止这种情况。
由于多次调用,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;
dzhpxtsq

dzhpxtsq3#

那就用innodb吧

START TRANSACTION;
SELECT ... FOR UPDATE;
if it does not exist
    INSERT ...;
else
    DELETE ...
COMMIT;

通过使用事务语义,可以避免多个连接相互重叠的问题。我想我甚至避免了任何僵局的机会。

相关问题