本文整理自网络,侵删。
目录
- 【功能背景】
- 【原始的SQL】
- 【原始的SQL分析】
- 【分析步骤】
- 【优化后的SQL】
- 【优化的SQL分析】
结合工作中的内容和大家分享一次Left Jon优化的过程,希望能给同学们新的思路。
【功能背景】
??? 我们需要按照用户订单号和商户号统计出购买的商品数量和售后的商品数量。涉及到的表和关系见下图:
很不幸工程师在起初进行表结构设计的时候没有在商户订单表中记录下购买的商品总数,在商户订单的售后单中也没记录下售后的商品数量。
【原始的SQL】
select o.no,s_order.no,sum(s_item.count),sum(after_sale_item.count) from buyer_order o left join seller_order s_order on o.id = s_order.buyer_order_id left join seller_order_item s_item on s_order.id = s_item.seller_order_id left join seller_order_after_sale after_sale on s_order.id = after_sale.seller_order_id left join seller_order_after_sale_item after_sale_item on after_sale.id = after_sale_item.after_sale_id where o.add_time >='2019-05-01' group by o.id,s_order.id order by o.id limit 0,10
以上SQL几个关键字段都使用了索引。??
【原始的SQL分析】
这是一条很常规的SQL,逻辑上也没什么毛病
这条SQL中有较多的连接查询,如果随着售后单的增加,连接的数据就会更多
将符合条件的数据都加载到内存后按照 order.id,s_order.id 进行分组统计,如果有100W的数据会怎样?如果你用代码去实现这么一段统计你会怎么做?
将统计完的数据再按照 order.id 进行排序,取出前10条数据。
从以上的SQL发现需要将符合条件的所有的数据加载到内存后要进行分组,统计,排序,最后再进行分页。我们能不能减少数据的加载数量呢?能不能减少数据库CPU的使用量,能不能先取少量的数据再统计呢?
基于以上的问题,我们进行了优化
【分析步骤】
作为旁观者一开始不了解我们功能需要输出什么样的数据,所以我们一开始要了解每张表存储的是什么样的数据,彼此之间的关系是什么。
我们忘记原来的SQL是什么样的,按照我们需要的数据,再次重新的思考,不要再陷入原来的SQL的漩涡中。
针对上面提出的问题,如何减少数据的加载?能不能先分页数据,再对分页的数据进行单独的统计呢?
那么我们是不是需要对group by进行优化,我们要想办法先分页
相关阅读 >>
将access数据库中数据导入到sql server中的详细方法实例
c#连接sqlserver数据库、插入数据、从数据库获取时间示例
更多相关阅读请进入《sql》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » MYSQL Left Join优化(10秒优化到20毫秒内)
相关推荐
评论
管理员已关闭评论功能...