MySQL 查询优化:获取用户关系信息 SQL 代码示例及优化建议
这段 SQL 代码用于查询用户关系信息,并根据关系类型进行筛选。
SELECT
c.uid, c.avatar
FROM
zc_user_relation a
LEFT JOIN zc_user c
on
<if test="type != null and type != ''">
<choose>
<when test="type == 1">
a.uid = c.uid
</when>
<when test="type == 2 or type == 3 ">
a.realation_uid = c.uid
</when>
</choose>
</if>
WHERE
<if test="type != null and type != ''">
<choose>
<when test="type == 1">
a.realation_uid = #{userId}
</when>
<when test="type == 2 or type == 3 ">
a.uid = #{userId}
</when>
</choose>
</if>
AND ( a.like_status = 1 OR a.super_like_status = 1 )
AND
<if test="type == 2 or type == 1">
not
</if>
EXISTS (
SELECT
1
FROM
zc_user_relation b
WHERE
a.realation_uid = b.uid
AND b.realation_uid = a.uid
AND ( b.like_status = 1 OR b.super_like_status = 1 )
)
可能的优化空间:
-
添加索引: 为
uid,realation_uid,like_status,super_like_status等字段添加索引,可以显著提高查询效率。 -
减少子查询: 子查询通常比较耗费资源,可以尝试将该查询改写为连接查询或使用临时表来优化性能。例如,可以使用
LEFT JOIN连接zc_user_relation表和本身,并使用条件b.uid != a.uid OR (b.like_status = 0 AND b.super_like_status = 0)来筛选符合条件的结果。 -
减少条件判断: 可以将
WHERE语句中多个条件判断简化为更少的判断条件,例如将type == 1和type == 2 or type == 3统一为type != null and type != '',然后在JOIN条件和WHERE条件中使用CASE WHEN语句来根据type值进行判断。 -
分页查询: 如果查询结果较大,可以考虑使用分页查询来降低查询的资源消耗。
-
优化数据表结构: 如果数据表结构不合理,可以尝试进行优化,如拆分表、合并表等操作,以提高查询效率。
建议: 针对具体情况进行优化,可以通过测试不同优化方案的执行效率来选择最佳方案。
原文地址: https://www.cveoy.top/t/topic/mLi2 著作权归作者所有。请勿转载和采集!