主要关注以下几点:

  • 设置数据库持久连接
  • 减少SQL语句的执行次数
  • 合理的创建索引
  • 仅获取需要的字段数据
  • 使用批量创建,更新和删除

设置数据库持久连接

  • 并不是设置的越大越好,数据库的并发连接数也是有限的
    1. 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数据库,数据量在百万级以下时,使用

  1. Record.objects.order_by('?')[:2]

来获取随机记录系列,性能不会比

  1. sample = random.sample(xrange(Record.objects.count()),n)
  2. result = [Record.objects.all()[i]) for i in sample]

差。