Java进阶开发MyBatisJava数据库优化搜索系统SQL性能优化技术架构
搜索与收藏功能设计
1. 概述
本文将介绍一个搜索与收藏功能的后端技术实现,包括数据模型设计、查询优化等关键技术点。
2. 数据模型设计
2.1 核心数据结构
核心数据结构如下:
{
"id": 1,
"name": "红烧排骨",
"image": "/static/recipes/pork-ribs.jpg",
"description": "经典美味的红烧排骨,肉质鲜嫩多汁",
"cookingTime": "45分钟",
"difficulty": "中等",
"likes": 2345,
"collects": 1234,
"views": 5678,
"author": {
"id": 1,
"nickName": "大厨小张",
"avatar": "/static/avatars/chef1.jpg",
"isFollowing": true
}
}
2.2 数据表设计
系统涉及以下几个主要数据表(伪代码):
- cyx_recipe - 菜谱表
CREATE TABLE cyx_recipe (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
image VARCHAR(200),
cooking_time VARCHAR(50),
difficulty VARCHAR(20),
likes INT,
collects INT,
views INT,
user_id BIGINT,
category_id BIGINT
);
- cyx_customer - 用户表
CREATE TABLE cyx_customer (
id BIGINT PRIMARY KEY,
nick_name VARCHAR(50),
avatar VARCHAR(200)
);
- cyx_user_follow - 用户关注关系表
CREATE TABLE cyx_user_follow (
id BIGINT PRIMARY KEY,
user_id BIGINT,
followed_user_id BIGINT
);
- cyx_user_favorite - 用户收藏表
CREATE TABLE cyx_user_favorite (
id BIGINT PRIMARY KEY,
user_id BIGINT,
target_id BIGINT
);
3. 查询优化实现
3.1 搜索查询优化
搜索查询的主要优化点:
- 使用LEFT JOIN关联用户表和关注表,保证即使用户未登录也能查询基本信息
- 通过CASE语句动态判断是否关注:
CASE
WHEN #{query.currentUserId} IS NULL THEN 0
WHEN c.id IS NOT NULL THEN 1
ELSE 0
END as is_following
- 支持按菜谱名称和分类进行过滤:
<where>
<if test="query.recipeName != null and query.recipeName != ''">
and a.name LIKE CONCAT('%', #{query.recipeName}, '%')
</if>
<if test="query.categoryId != null and query.categoryId != ''">
AND a.category_id = #{query.categoryId}
</if>
</where>
- 按收藏数排序展示最热门的菜谱:
order by a.collects desc
3.2 收藏查询优化
收藏查询的主要优化点:
- 使用INNER JOIN关联收藏表,只查询已收藏的菜谱
- 通过user_id和target_id双重条件确保数据准确性
- 复用搜索查询的结果映射,保持数据结构统一
4. MyBatis映射配置
使用ResultMap实现复杂对象映射:
<resultMap id="RecipeDetailMap" type="org.dromara.cyx.domain.vo.SearchInfoVo">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 其他基本属性映射 -->
<association property="author" javaType="org.dromara.cyx.domain.vo.SearchInfoVo$AuthorVO">
<id property="id" column="author_id"/>
<result property="nickName" column="author_nickname"/>
<result property="avatar" column="author_avatar"/>
<result property="isFollowing" column="is_following"/>
</association>
</resultMap>
5. 性能优化建议
- 索引优化
- 为recipe表的name、category_id建立索引
- 为user_follow表的user_id和followed_user_id建立联合索引
- 为user_favorite表的user_id和target_id建立联合索引
- 缓存优化
- 对热门菜谱数据进行缓存
- 对用户关注关系进行缓存
- 使用本地缓存+分布式缓存的多级缓存架构
- 分页优化
- 采用ID范围分页代替OFFSET分页
- 控制每页数据量
- 实现滚动加载而非传统分页
6. 总结
本文介绍了美食APP中菜谱搜索与收藏功能的后端实现方案,包括:
- 采用合理的数据结构设计
- 实现高效的多表关联查询
- 使用MyBatis的高级特性
- 多方面的性能优化措施
这些技术方案可以为类似的社交型内容平台提供参考。