我在一个非常简单的案例中遇到了一个有趣的问题。我在mysql数据库中有posts和users表。帖子可以被用户喜欢。所以有一个单独的表叫做likes,它有列: user_id
, post_id
.
当用户点击应用程序中的like按钮时,执行对php脚本的请求。脚本正在检查表中是否有post\u id和user\u id与请求中的信息匹配的行。用户对一个帖子不能有超过1个喜欢,如果我在已经喜欢的帖子上按like,以前的like应该会消失
我现在使用2个查询:1)检查like是否存在于表中2)如果记录不存在-我将添加它,如果存在,我将删除它。
现在我看到,在我的表中,同一个用户对同一个帖子有两个赞。似乎单个用户的两个请求几乎可以立即执行。
我如何优化它-这样就不可能添加两个喜欢从用户的一个职位?我认为我需要运行一个查询,但它应该是什么?
3条答案
按热度按时间k4emjkb11#
只需使用一个标志(值为0或1的列),并在不删除整行的情况下更新该值。
步骤如下:
检查行是否存在。
如果存在,则更新列(如-1,与-0不同)
就这样。
在模板中,检查0或1的“不相似”和“相似”
agxfikkp2#
显然,insert/update部件被多次激发。您应该调查为什么会发生这种情况,然后尽可能防止这种情况。
由于多次调用,dbms被多次询问条目是否存在。所有的电话都是否定的。然后激发多个插入,得到重复的。因此,在sql方面,有两件事出错了:
为什么可以为同一个帖子和用户插入多个记录?应提供一个主键或唯一键,以使这不可能。
我认为这对于你的数据模型是必须的。
行动的顺序是错误的。一个可能的解决方案是先插入(一个会成功,另一个会失败——当然提供了上述密钥!),如果失败,将发布更新。然而,mysql甚至可以一步到位:
与
ON DUPLICATE KEY
:dzhpxtsq3#
那就用innodb吧
通过使用事务语义,可以避免多个连接相互重叠的问题。我想我甚至避免了任何僵局的机会。