WHERE子句编写方式
SELECT p.post_id, p.content, p.likes_count, p.comments_count, c.comment_id, c.comment_content
FROM posts p
JOIN comments c ON p.post_id = c.post_id
WHERE p.post_date >= CURDATE() - INTERVAL 1 WEEK
AND p.likes_count > 100
AND p.comments_count > 50
AND (SELECT COUNT(*) FROM comments sub_c WHERE sub_c.post_id = p.post_id) > 10;
优化策略
- 索引创建:
- 在
posts
表的 post_date
、likes_count
、comments_count
字段上创建复合索引 CREATE INDEX idx_post_date_likes_comments ON posts (post_date, likes_count, comments_count);
。这样在查询近一周内发布且点赞数和评论数满足条件的帖子时,能利用索引快速定位。
- 在
comments
表的 post_id
字段上创建索引 CREATE INDEX idx_comment_post_id ON comments (post_id);
,以便在连接 posts
表和 comments
表以及子查询统计评论数量时提高效率。
- 子查询优化:上述子查询使用了相关子查询,可以考虑将其改写为
JOIN
方式,提高查询效率。例如:
SELECT p.post_id, p.content, p.likes_count, p.comments_count, c.comment_id, c.comment_content
FROM posts p
JOIN comments c ON p.post_id = c.post_id
JOIN (
SELECT post_id
FROM comments
GROUP BY post_id
HAVING COUNT(*) > 10
) sub ON p.post_id = sub.post_id
WHERE p.post_date >= CURDATE() - INTERVAL 1 WEEK
AND p.likes_count > 100
AND p.comments_count > 50;
高并发场景下保证查询效率
- 读写分离:使用主从复制架构,主库负责写操作,从库负责读操作。这样可以分散读压力,避免高并发读操作影响写操作性能。
- 缓存机制:引入缓存系统(如 Redis),将热门帖子和评论信息缓存起来。在高并发情况下,优先从缓存中读取数据,减少数据库压力。对于写操作,更新数据库后及时更新缓存。
- 数据库连接池:使用连接池管理数据库连接,避免高并发场景下频繁创建和销毁数据库连接带来的性能开销。可以使用如 HikariCP 等高性能连接池。
- 分布式架构:将数据库按照一定规则(如按用户ID范围、按地区等)进行分片,减少单个数据库节点的负载,提高整体的并发处理能力。