MySQL点赞功能应建user_like表,含user_id、target_type、target_id等字段,设UNIQUE KEY(user_id,target_type,target_id)防重复;用INSERT...ON DUPLICATE KEY UPDATE实现点赞,DELETE实现取消;查状态用SELECT 1,查总数用COUNT(*),需建(target_type,target_id)联合索引。

用 MySQL 实现点赞功能,核心是设计合理的数据表结构 + 配合业务逻辑做增删查操作,避免重复点赞、支持快速统计、兼顾性能和扩展性。
点赞表基础结构设计
推荐单独建一张 user_like 表(或 post_like),不建议直接在内容表(如 article)里加 like_count 字段并频繁更新——容易引发并发冲突和写入瓶颈。
典型字段如下:
- id:主键(可选,非必须,但便于排查和分页)
- user_id:点赞用户 ID(关联用户表)
- target_type:被点赞对象类型(如 'article'、'comment'、'video',支持多类型复用)
- target_id:被点赞对象主键(如文章 ID、评论 ID)
- created_at:点赞时间(用于排序、防刷、过期等)
关键约束:UNIQUE KEY (user_id, target_type, target_id) —— 确保同一用户对同一目标只能点一次赞,数据库层杜绝重复。
实现“点赞 / 取消点赞”逻辑
用一条 INSERT ... ON DUPLICATE KEY UPDATE 或先查后判均可,但推荐前者更简洁、原子性强:
- 点赞时执行:
VALUES (123, 'article', 456, NOW())
ON DUPLICATE KEY UPDATE created_at = NOW();
- 取消点赞时执行:
前端调用接口时,可统一走“切换”逻辑:先尝试插入,若主键冲突则执行删除(或根据影响行数判断是新增还是删除)。
高效查询点赞状态与总数
查某用户是否点过赞(如详情页显示“已点赞”按钮):
SELECT 1 FROM user_like WHERE user_id = 123 AND target_type = 'article' AND target_id = 456 LIMIT 1;查某内容的总点赞数(常用于列表页展示):
SELECT COUNT(*) AS like_count FROM user_like WHERE target_type = 'article' AND target_id = 456;注意:为提升性能,务必在 (target_type, target_id) 上建立联合索引;若常按用户查历史点赞,再加 (user_id) 索引。
进阶考虑:软删除、过期、热度加权
如需支持“撤回点赞后仍计数”或“7天内有效点赞”,可在表中加 status(0=有效,1=已取消)或 expires_at 字段,查询时加上条件过滤。
若需热度排序(如按点赞数+时间衰减),不建议实时计算,可定时任务将热度值写入缓存或冗余字段,避免每次查询都 JOIN 或函数运算。










