[Django+微信小程序开发]08Django模型层优化

Django模型层的优化

首先我的最终目的是为了开发PythonDjango+微信小程序的校园应用,所以查看我这个系列就可以查看一些有用的内容,但笔记都是记录的我需要记录的一些内容,并不是整个项目的集合.

Django模型层的变更与迁移:

  • makemigration appname
  • migrate 执行到数据库
  • selmigrate appname 0014 查看执行sql语句(20条)
  • showmigration appname 显示应用变更历史和迁移历史

Django模型层-懒加载,预加载

  • 懒加载的问题根源
    • ORM框架的不透明
      • 一次查询经过ORM框架会不会变成两次SQL语句
      • 两次拆线呢通过ORM框架能不能变成一次查询
    • 懒加载
      • 存在外键和多对多的关系
      • 不检索关联对象的数据
      • 调用关联对象会再次查询数据库
    • 查看DjangoORM的数据加载
      • 的确两次请求
  • 预加载的方法
    • 预加载单个关联对象-select_related
    • 预加载多个关联对象-prefetch_related
    • user = User.object.prefetch_related(“menu”)
    • user[0].menu.all()
  • 性能数据对比
    • 预加载比懒加载快很多的
    • 要查询一对象的关联对象的时候,一定要预加载(提高性能)
Django模型层优化(长连接)
  • 数据库连接的处理逻辑
    • 每个请求都将重复连接数据库
    • 每次重复时常:–1--,–1--,一次连接时常:–1111–
    • 处理高并发请求给服务还来巨大压力
    • 无法承载更高并发的服务
  • 避免负优化
    • 存储数据库连接的位置:线程局部变量
    • 数据库支持的最大连接数
      • 打开navicat命令行
      • show variables like “%max_connection%”;
      • set global max_connections = 200 设置为200
    • CONN_MAX_AGE(最大连接数)配置指南
      • 部署线程数:n<数据库最大连接数
      • 不建议开发模式使用CONN_MAX_AGE
      • 每个请求会创建一个线程
  • 理论效果
    • 建立或者关闭DB连接的事件(5ms)
    • DB查询事件15ms
    • 短链接利用率:15/(15+5*2) = 0.6
    • 长连接利用率153(153+5*2) = 0.82

Django模型层数据库操作规范

  • 正确使用索引

    • 索引应该被索引的列
    • 不索引不该被索引的列
  • 使用iterator迭代器迭代QuerySet

    • QuerySet非常大时,迭代器节省内存
  • 理解对象的属性缓存

    • 不可调用属性:就是它默认的数据不包含外键
    • 可调用的属性:就是它的外键,以及多对多的数据,可以用函数调用,
    • 把可调用属性赋值为Python变量,再次调用的时候,就不需要再调用数据库,而是调用Python变量的数据即可(提升性能)
  • 数据库的工作交给数据库做
    • 过滤:exclude,filter等属性
    • 聚合:使用annotate函数聚合
    • 必要的时候使用原生的SQL
  • 正确检索数据
    • 使用被索引 列字段检索
    • 使用被unique修饰的字段检索
  • 不要进行不必要的检索
    • QuerySet使用Values(),Value_list()函数返回Python结构容器
    • 查询结果长度使用QuerySet.count()而不是len(QuerySet)
    • 判断是否为空是哟个QuerySet.exists()而不是if QuerySet
  • 不要进行不必要的排序
    • 不要进行不必要的排序
  • 批量操作
    • 大量数据,批量操作
发布了63 篇原创文章 · 获赞 0 · 访问量 1175

猜你喜欢

转载自blog.csdn.net/qq_37463791/article/details/104709459