今天在工作中需要查询到用户相关明细数据,该数据需要连接四个表(使用left join),使用5个表的字段,且数据量较大。在操作中发现直接使用
select column from a left join b on a.id = b.id left join c on b.uid = c.uid left join d on c.uid = d.uid left join e on a.id = e.id
(其中主表a是一个订单明细表,表中有15000+条数据15个字段)
查询十分缓慢,后更发生navicat直接卡死的现象,后台开发同事指导我可以使用一个子查询(实际上要再多嵌套一个查询)进行对主表的过滤,可以大大优化这个sql语句。难点在于在from中嵌套的这个子查询需要select的字段到底有哪些?其中部分是直接在主句使用到的字段,部分是需要用于作为其他表join到该”主表”的连接字段。
后续重新思考和实操,发现两个重点:
1. 如果在写from主表时使用该子查询的环节中,直接在子查询中select需要调用的字段实际上会比较困难,容易出错(遗漏字段),最好的方法是先省略这些字段把子查询、连接写完,再选择该子查询需要select到的字段。
2. 在这个子查询中要进行对原主表的最优化过滤,才能实现该sql语句的最佳优化。
(网上也有相关资料描述这种优化:使用from中的子查询来优化join)