在本科我们做项目的时候总是会碰到这样的一种需求:当前用户查看各自相册列表,相册显示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执行时内存资源占用,排序时间