问题:
django rest framework的使用大大提高了开发效率,产品开发周期明显缩短。在业务发展初期,数据库记录非常小的情况下,比如几万条及以下,查询速速尚且满足需要。
但是随着业务规模的可扩大,当数据库记录达到10w以上,加上join等的影响, 查询速度越来越慢。django rest_framework已经捉襟见肘。
优化要点:
涉及数据库查询的操作,尽量批量(id__in=ids);
不用外键,不用join;关于join包括:
a) models中使用property定义查询,属于join;使用缓存;
a) 对于记录数少的表,初始化时从数据库读出后,放入map,提高效率;
b) 对于经常使用的表,表记录又不是很多的,可以考虑用cache缓存下,每次的请求,先到cache中查,如果找到,直接返回,如果没有找到,再查询数据库,并将结果放入cache中;返回结果时,只返回指定长度数据,也就是使用分片[:];
Apple.objects.filter(**filters)[0:30], 只返回30条记录不需要的字段,不要查询;
example
app_detail = AppDetail.objects.filter(app_id=app_id)
修改为
app_detail = AppDetail.objects.filter(app_id=app_id).values('flag_id')
只查询flag_id,不用的字段不查询,这样就可以节省几十毫秒;
建立索引;
为经常用到的查询子句中的条件建立索引,例如create_time等
工具:
connections可以用于查看django执行的sql语句及消耗的时间
from django.db import connections
c = connections['database_name']
print c.queries