【发布时间】:2021-07-17 20:22:58
【问题描述】:
所以我有两个表,“videos”和“video_likes”。 “视频”表如下所示:
id | creator | url | likes
1 | 5 |https://... | 10
2 | 8 |https://... | 20
3 | 4 |https://... | 30
4 | 2 |https://... | 40
“video_likes”表如下所示:
id | video_id | like_user_id
1 | 2 | 8
2 | 2 | 5
3 | 4 | 2
如您所见,两者都是基本表格。好的,现在这是有趣的部分。当用户喜欢/不喜欢帖子时,我不会从“videos”表中增加和减少“喜欢”,而是将它们更新为与“video_likes”表中的行数相同,如下所示:
UPDATE videos SET likes = (SELECT COUNT(id) FROM video_likes WHERE video_id = '$video_id') WHERE id = '$video_id'
什么时候该拿号码了。喜欢的视频,我只是这样做:
SELECT likes FROM videos WHERE id = '$video_id' LIMIT 1
问题是每次用户喜欢或不喜欢视频时都会调用更新查询,我猜这可能非常昂贵。我有三个与此问题相关的问题:
1) 当“video_likes”表增长到一个很大的数字(比如一百万或十亿)时是否存在性能问题?
2) 更新计数时sql会锁表吗?如果是,新插入(用户在更新期间喜欢该帖子)会失败吗?如果有,如何预防?
3) 达到相同结果的最快和最有效的方法是什么?我不想增加或减少 likes 字段,因为这只是一种非规范化,实际喜欢计数可能存在不一致。这样做的正确方法是什么?
这些是过去几天一直困扰着我的几个问题。希望你能回答。问候。
【问题讨论】:
-
你的主要问题是*sql注入
-
我确实采取了一些措施来防止它们。只是没有包括,因为它不是我的问题的一部分。
标签: mysql query-optimization database-performance