1. 使用标准的数据库优化技术:

    在进行Django数据库访问性能优化之前,首先应该使用标准的数据库技术对其进行优化,比如给字段加索引,通过使用 django.db.models.Field.db_index 来给一个Django模型类的字段加索引,设置这个属性字段的Field.db_index=True

    注:django对model中的fkunique = True的字段将自动创建索引。

  2. 理解Django中QuerySet的工作机制对数据库访问优化至关重要:

    QuerySet是懒加载的,它只有在需要的时候才会被执行,并且会将执行的结果保存在内存中。

  3. 理解Django中QuerySet的缓存机制:

    QuerySet对调用方法是不执行缓存的。比如下面的两端代码,其中一个会被缓存,另一个不会:


    >>> entry = Entry.objects.get(id=1) >>> entry.blog # Blog对象会被从数据库查询出来 >>> entry.blog # 第二次访问的缓存对象,不会再次执行查询

    但是对于调用的查询方法,是不会被缓存的:

    >>> entry = Entry.objects.get(id=1)
    
    >>> entry.authors.all() # 第一次会执行查询
    
    >>> entry.authors.all() # 第二次会再执行一次查询
    
    
  4. 使用模板语言中的with标签:

    在视图模板中,针对QuerySet对象使用with标签,可以让数据被缓存起来使用。

  5. 使用iterator()方法:

    对于缓存的QuerySet使用iterator()方法。

  6. 将查询计算操作放在数据库中完成,不要在Python代码中完成。

    1. 使用filter,exclude完成查询过滤;

    2. F()查询表达式;

    3. 使用聚合函数来完成数据库聚合操作。

  7. 使用QuerySet.extra()明确的指出要查询的字段。

  8. 对于复杂的数据库查询操作,使用原生SQL实现。

  9. 尽量一次查询出所有需要的信息。

  10. 只查询需要的数据:

    1. 某些情况下,只使用 QuerySet.values()values_list()方法,查询出符合条件的结果集而不是完整的对象结果集;

    2. 某些情况下,只使用 QuerySet.defer()only()过滤数据。

  11. 如果只是查询集合的数量,使用QuerySet.count()函数,而不是len(QuerySet)

  12. 如果想知道某个记录是否包含在某个结果集中,使用 QuerySet.exists()函数;

  13. 避免过多的使用 count()exists() 函数;

  14. 对于批量更新和删除操作使用 QuerySet.update()QuerySet.delete()

  15. 理解 QuerySet.select_related() 方法:

    select_related()会在查询过程中尽量深入的查询关联数据,这样在需要查询大量外键的数据时非常有用,如:


    >>> e=Entry.objects.get(id=5) #这部操作会查询数据库 >>> b=e.blog #该操作会再次查询数据库

    而采用select_related()查询的效果是:


    >>> e=Entry.objects.select_related().get(id=5) #这步操作会查询数据库 >>> b=e.blog #不会再次查询数据库
  16. 如果需要查询对象的外键,则使用外键字段而不是使用关联的对象的主键,比如:


    >>> entry.blog_id #应该使用这种方式 >>> entry.blog.id #不要使用这种方式

Django 数据库访问性能优化的更多相关文章

  1. 数据库访问性能优化 Oracle

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  2. Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  3. spring配置druid连接池和监控数据库访问性能

    Druid连接池及监控在spring配置如下: <bean id="dataSource" class="com.alibaba.druid.pool.DruidD ...

  4. 【转载】HBase 数据库检索性能优化策略

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...

  5. 【Spring Boot&&Spring Cloud系列】提高数据库访问性能

    前言 使用关系型数据库的应用系统的性能瓶颈最终还是数据库.随着业务的迅速增长,数据量会不断增大,会逐渐暴露关系型数据库的弱点,性能会大幅度的降低 项目地址:https://github.com/And ...

  6. Java面试准备十六:数据库——MySQL性能优化

    2017年04月20日 13:09:43 阅读数:6837 这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢. 来自MySQL性能优化的最佳20+经验 为查询 ...

  7. 数据库SQL性能优化

    1.in与exists的效率比较 in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询.一直以来认为exists 比in 效率高的说法是不准 ...

  8. oracle数据库应用性能优化经验(培训讲义)

    这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...

  9. HBase 数据库检索性能优化策略--转

    https://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的 ...

随机推荐

  1. GO Range

    Go 语言中 range 关键字用于 for 循环中迭代数组(array).切片(slice).通道(channel)或集合(map)的元素.在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 ...

  2. DMVPN基础配置

    DMVPN基础拓扑: 配置步骤:    1. 基本IP地址配置实现网络可达    2. 配置GRE多点隧道(mGRE)和NHRP(下一跳解析协议)    3. 配置EIGRP路由协议    4. 配置 ...

  3. 从蜘蛛侠到仙剑,为何知名IP都要开发VR游戏?

    去年3月底斯皮尔伯格指导的<头号玩家>上映,为全球玩家和影迷塑造出一个庞大.刺激而又真实无比的虚拟游戏世界--"绿洲".电影上映后,在人们感叹斯皮尔伯格旺盛的艺术想象力 ...

  4. Django-ORM的F查询和Q查询

    当一般的查询语句已经无法满足我们的需求时,Django为我们提供了F和Q复杂查询语句.假设场景一:老板说对数据库中所有的商品,在原价格的基础上涨价10元,你该怎么做?场景二:我要查询一个名字叫xxx, ...

  5. Python 之并发编程之manager与进程池pool

    一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...

  6. Tensorflow机器学习入门——AttributeError: module 'scipy.misc' has no attribute 'toimage'

    这个bug的解决办法: import cv2 # scipy.misc.toimage(image_array).save('cifar10_data/raw/%d.jpg' % i) cv2.imw ...

  7. android 支持上拉加载,下拉刷新的列表控件SwipeRefreshLayout的二次封装

    上拉加载,下拉刷新的列表控件,大家一定都封装过,或者使用过 源代码,我会在最后贴出来 这篇代码主要是为了解决两个问题 1.滑动冲突得问题 2.listview无数据时,无数据布局的展示问题 下方列出的 ...

  8. UICollectionView特殊布局

    流式http://www.code4app.com/thread-30894-1-1.html 美团http://www.code4app.com/thread-30930-1-1.html 复杂布局 ...

  9. 在iOS项目中,这样才能完美的修改项目名称

    https://www.cnblogs.com/liangyi-cn/p/8657474.html 前言: 在iOS开发中,有时候想改一下项目的名字,这会遇到很多麻烦. 直接改项目名的话,Xcode不 ...

  10. 「快学Docker」Docker简介、安装和Hello World实现

    前言 Docker已经成为了一门炙手可热的技术,每个程序员(特别是后端程序员)都应该学习下Docker这门技术. Docker是什么 来自官网的定义:Docker是以Docker容器为资源分割和调度的 ...