一个sql调优实例

在本科我们做项目的时候总是会碰到这样的一种需求:当前用户查看各自相册列表,相册显示10张照片(为了方便讨论如何优化,这里只讨论当前一个用户的一个相册),在相片的下方显示该相片的评论数。

好了,这种类似需求颇为常见,大部分的人都会采用下面这种非常合理的做法。

分两步进行:

(1)select photo_id,photo_title,photo_url from photo where user_id = ? limit 10 选出当前用户第一页相册信息

(2)对于(1)的结果,对于photo_id进行循环操作 select count(*) from photo_comment where photo_id = ?

可以很清楚的看到,我们对数据库服务器提交了 1 + 10 =11次query。

很显然,这样的做法非常糟糕,如果我们不把这个问题简单化,而是,当前用户显示5个相册列表,每个相册显示10张照片,每张照片背后显示他的评论数,进行query提交的次数就会变成 1 + 5 + 50 = 56次。在实际编写代码的时候,为了实现这样的需求而编写这样的代码真的非常的糟糕。所以我们应该优化

依旧分两步进行

(1)同上(1)

(2)我们拥有10个photo id,先进行拼装。可以不可以一次query就完成统计呢?sql里面有一个关键字“in”,所以 select photo_id,count(*) from photo_comment where photo_id in ? group by photo_id

很显然,我们将query提交的次数降低到了1 + 1=2次。

其他:query的性能分析通常考虑的因素

(1)query次数

(2)结果集处理次数

(3)I/O次数

(4)query执行时内存资源占用,排序时间

 

转载于:https://www.cnblogs.com/richardhu1991/archive/2013/03/03/2941235.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值