(一)案例介绍
有四张表:用户表(user)、商户表(business)、订单表(orders)、订单评论表(comment),现在要根据“商户ID(businessId)”查询该商户的所有评论,怎么做?
(二)解决思路
1.最开始的思路
一开始,我想利用“商户ID(businessId)”查询出所有订单(orderList),在遍历所有订单,取出评论,组成评论集合。
问题:这样每遍历一个订单,就需要连接一次数据库,执行一次查询,效率太低。
2.思路改进
查询出该商户的所有订单之后,把订单的id组成一个数组“Integer[] ids”,然后利用
where id in(
<foreach collection="ids" item="id" separator=",">
id
</foreach>
)
一次性执行所有的查询语句。
问题:在程序里我得先查询数据库得到所有订单,再根据查询的订单集合构建“待查询订单数组(Integer[] ids)”,依然需要连接2次数据库,执行2次查询,效率有所提高,但是还有改进空间。
3.优化方案
直接根据“商户ID(businessId)”进行多表联查,所有的操作都在数据库中完成,代码如下:
<select id="searchByPage" parameterType="Comment" resultMap="CommentMap">
SELECT co.id,co.order_id,co.content,co.star,co.createTime,u.phone,b.title
FROM `comment` co,orders o,`user` u,business b
<where>
AND co.order_id=o.id AND o.user_id=u.id AND o.business_id=b.id
<if test="id != null">AND co.id=#{id}</if>
<if test="orderId != null">AND co.order_id=#{orderId}</if>
<if test="searchKey != null and !"".equals(searchKey.trim())">
AND (
b.title LIKE CONCAT('%',#{searchKey},'%')
OR u.phone=#{searchKey}
)
</if>
<if test="business != null and business.id != null">AND b.id=#{business.id}</if>
</where>
ORDER BY co.createTime ASC
</select>
优点:一次连接数据库,得出结果,减少了代码量,效率得到了提高!
问题:方案3与方案2在大数据量的情况下,谁更快?这一点暂无法得到验证!