业务场景SQL优化

理解业务场景,否定不合理的需求,正确使用数据库

满足使用方需要的功能,而不是满足使用方想要的功能


实际案例:

        一个输入框支持输入N个条件查询

这样的输入框在APP/小程序比较常见,一个输入框支持输入多种条件进行查询,上面给出一个案例框,实际可能条件更多维度。

这种查询对应的SQL大概长这样

SELECT
    t1.*,
    t2.* 
FROM
    table_a t1
    LEFT JOIN table_b t2 ON t1.id = t2.id
    LEFT JOIN table_c t3 ON t1.id = t3.id 
WHERE
    t1.field LIKE '%赵%' 
    OR t2.field LIKE '%赵%' 
    OR t3.field LIKE '%赵%'

问题很明显,因为无法分辨输入的值到底属于什么,所以只能多张表去关联模糊查询,条件还是 或,这就造成性能低下且结果集不精准的问题


初步优化:

在界面中提供多维护输入框 且 再提供多维度类型,类似这样

业务场景SQL优化_第1张图片

先选择自己要查询的维度,再输入要查询的关键字,这样对于SQL就可以简化很多,且结果很精准

例如输入和选择的是 table_a 表中 field则SQL如下
SELECT
    t1.*,
    t2.* 
FROM
    table_a t1
    LEFT JOIN table_b t2 ON t1.id = t2.id
    LEFT JOIN table_c t3 ON t1.id = t3.id 
WHERE
    t1.field LIKE '%赵%' 

虽然结果精准了不少,查询性能也好了不少(就事论事这里不考虑like问题先),但是问题还是存在,多关联了一些表


进一步优化:

        在不需要关联表的时候不去做关联,提升SQL性能

        对于后台管理系统的页面主要分为三块:搜索条件、table列表、操作按钮集(删除、修改、详情等)

        详情:table列表一般都会展示一些“相对”重要字段,详情则展示此条数据需要展示的详细字段

        这些字段有的在 业务主表中,有的则分布在其他表中,甚至需要关联其他表做复杂的计算才能得出

思路:这里分为两种

        1、这个字段不必要:没啥好说的,不查询不展示此字段就行

        2、这个字段必要:在搜索条件集 和 table列表、详情都存在,但是查询这个字段非常的费事(关联表且需做计算)

                a:和产品沟通将这个字段从 table列表中移除,放入详情页中---可以避免一打开此页面就需要复杂的连表计算,而打开详情页也变成了精准搜索,性能相对也就没那么差了

                b:SQL层面的调整,当用户不输入此条件的查询 或 非详情查询 则不连表计算此值(xml文件中标签)

你可能感兴趣的:(sql,数据库,mysql)