主要关注以下几点:
- 设置数据库持久连接
- 减少SQL语句的执行次数
- 合理的创建索引
- 仅获取需要的字段数据
- 使用批量创建,更新和删除
设置数据库持久连接
- 并不是设置的越大越好,数据库的并发连接数也是有限的
DATABASES['default']['CONN_MAX_AGE'] = 60
减少SQL语句的执行次数
当获取对应外键的数据时,为了减少SQL语句执行次数,可以使用:
- select_related(): 查询一对一外键的优化
- prefetch_related(): 查询多对多外键或通用外键的优化
外键字段作为其参数
合理的创建索引
- 主键,外键,唯一建会自动创建索引
- 创建原则:
- 频繁出现在 where 条件子句(fileter/exclude…)里的字段
- 经常用来被分组(group_by)或排序(order_by)(比如:常用创建时间dt_created排序)的字段
- 用于连接主键、外键的字段
- 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频率来确定
- class Meta: index_together = (‘xxx’, ‘xxx’) # 联合索引
- bool 型和 只有个别数值的 choices 的类型不需要加
仅获取需要的字段数据
仅需要表中部分数据时,可以使用:
- defer(): 排除不使用的字段
- only(): 仅返回参数中的字段数据
使用批量创建,更新和删除
- bulk_create: 批量创建,执行一次sql,创建多条数据
- update: 批量更新
返回随机数据
Django下,使用mysql数据库,数据量在百万级以下时,使用
Record.objects.order_by('?')[:2]
来获取随机记录系列,性能不会比
sample = random.sample(xrange(Record.objects.count()),n)
result = [Record.objects.all()[i]) for i in sample]
差。