一 查询冗余的条数
如实际前台只需要TOP10,但是查询时使用 LIMIT 100。
解决方案:使用需要的大小限制。e.g. LIMIT 10,或者至多 LIMIT 20。
二 查询冗余的的列
避免使用 “ select * “ 这种不加选择的select语句,或者“ select col1,col2 “而实际上只使用col1的情况。这会带来多余的I/O,数据传输,内存,CPU的消耗。
解决方案:只select 需要的列,即最精简的sql。
三 重复查询相同的数据
这里的“重复查询相同的数据”不仅仅是sql语句相同,并且涉及的表基本是“稳定不变”的,即每次查询的结果也基本是相同的。换言之,对于这种基本稳定但是又不是永恒不变的数据,根本用不着每次都去请求(当然,也绝对不能写死)。
例如:
一个BBS系统,用户的头像URL基本是稳定的,而用户评论的地方通常需要显示该用户的头像,如果一个用户多次评论, 则每次显示都要回数据库查询头像的URL,进而拿到头像图片进行显示。这样重复查询非常浪费且不必要,这个问题一般怎么解决呢?
在初次查询时做一个缓存,以后的每次查询都先查缓存即可,如果用户改了头像,则在改头像操作返回成功之前,更新该用户头像URL缓存,或者令其原来的头像URL失效,每次缓存查找不到则从数据库中查找,并回填缓存。