如何调整数据库表结构以提升问答站点SQL查询速度?
问答站点查询性能优化方案
一、表结构调整方案
新增冗余预统计字段,避免实时聚合查询
给question表新增like_count、dislike_count两个INT类型字段,默认值为0。每次用户提交/取消投票时,原子更新对应字段的数值,无需每次展示问题时实时统计vote表数据,直接消除一次聚合查询开销。优化vote表结构适配后续回答模块
给vote表新增tinyint类型的target_type字段(1代表问题投票,2代表回答投票),将原question_id字段改为target_id,后续回答投票无需额外新建投票表,共用同一套投票逻辑。同时给vote表新增联合索引(target_type, target_id, user_id),大幅提升单用户投票状态校验、单内容投票统计的查询速度。回答表参考相同设计逻辑
后续新增的answer表同样预置like_count、dislike_count冗余字段,配套user_id外键索引,沿用上述投票逻辑。
二、查询逻辑优化(进一步降低查询次数)
原来的4次单表查询可合并为1次联表查询,示例SQL如下:
SELECT q.id, q.title, q.date, q.user_id, q.like_count, q.dislike_count, u.username, v.type AS current_user_vote_type -- 为空则代表当前用户未投票 FROM question q LEFT JOIN `user` u ON q.user_id = u.id LEFT JOIN vote v ON v.target_id = q.id AND v.target_type = 1 AND v.user_id = ? -- 代入当前登录用户ID WHERE q.id = ? -- 代入目标问题ID
后续查询回答列表时,同理可通过一次联表查询拉取所有回答的内容、答主信息、投票数据、当前用户投票状态,无需逐行发起独立查询。
三、一致性保障建议
投票操作需用事务包裹:写入vote表记录和更新对应内容的冗余计数字段放在同一事务中执行,避免出现数据不一致问题。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

