数据库访问优化

使用标准数据库优化技巧

  1. 索引。我们可以使用Field.db_index或者Meta.index_together在Django中添加索引,优先向经常使用filter(),exclude(),order_b()等查询的字段添加索引,帮助我们更快的查找。
  2. 合理使用字段类型

了解QuerySets

  理解QuerySets 是通过简单的代码获取较好性能至关重要的一步:

要避免性能问题,理解以下几点非常重要:

    • QuerySets 是惰性的。
    • 什么时候他们被评估。
    • 数据保存在内存中。

和整个QuerySet的缓存相同,ORM对象的属性的结果中也存在缓存。 通常来说,不可调用的属性会被缓存。 例如下面的example Weblog models

 entry = Entry.objects.get(id=)
entry.blog # Blog object is retrieved at this point
entry.blog # cached version, no DB access

但是通常来讲,可调用的属性每一次都会访问数据库。

entry = Entry.objects.get(id=)
entry.authors.all() # query performed
entry.authors.all() # query performed again

要小心当你阅读模板代码的时候 —— 模板系统不允许使用圆括号,但是会自动调用callable对象,会隐藏上述区别。

要小心使用你自定义的属性 —— 实现所需的缓存取决于你,例如使用cached_property装饰符。

使用with模板标签

要利用QuerySet的缓存行为,你或许需要使用with模板标签。

使用iterator()

当你有很多对象时,QuerySet的缓存行为会占用大量的内存。 这种情况下,采用iterator()解决。

在数据库中而不是python中做数据工作

用唯一的被索引的列来检索独立对象

一次性检索你需要的任何东西

不要检索你不需要的东西

批量插入

创建对象的时候,尽可能使用bulk_create()来减少SQL查询的数量。此方法以高效的方式(通常只有1个查询,无论有多少对象)将提供的对象列表插入到数据库中:,例如:

Entry.objects.bulk_create([
Entry(headline='This is a test'),
Entry(headline='This is only a test'),
])

优于:

Entry.objects.create(headline='This is a test')
Entry.objects.create(headline='This is only a test')

注意 :

  • 将不会调用模型的save()方法,并且不会发送pre_savepost_save信号。
  • 它不适用于多表继承场景中的子模型。
  • 如果模型的主键是AutoField,则不会像save()那样检索并设置主键属性,除非数据库后端支持(当前是PostgreSQL)。
  • 它不适用于多对多关系。

这也可以用在ManyToManyField中,所以:

my_band.members.add(me, my_friend)

优于

my_band.members.add(me)
my_band.members.add(my_friend)

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

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

    使用标准的数据库优化技术: 在进行Django数据库访问性能优化之前,首先应该使用标准的数据库技术对其进行优化,比如给字段加索引,通过使用 django.db.models.Field.db_inde ...

  2. 数据库访问优化漏斗法则- 四、减少数据库服务器CPU运算

    数据库访问优化漏斗法则这个优化法则归纳为5个层次:1.减少数据访问次数(减少磁盘访问)2.返回更少数据(减少网络传输或磁盘访问)3.减少交互次数(减少网络传输)4.减少服务器CPU开销(减少CPU及内 ...

  3. 「Django」数据库访问优化

    先做性能分析 - 两个工具 django.db.connection from django.db import connection# contextprint connection.queries ...

  4. Django数据库性能优化之 - 使用Python集合操作

    前言 最近有个新需求: 人员基础信息(记作人员A),10w 某种类型的人员信息(记作人员B),1000 要求在后台上(Django Admin)分别展示:已录入A的人员B列表.未录入的人员B列表 团队 ...

  5. 数据库访问优化之四:减少数据库服务器CPU运算

    1.使用绑定变量 绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值. 非绑定变量写法:Select * from employee where id=123456 ...

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

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

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

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

  8. 数据库SQL优化大总结之 百万级数据库优化方案(转载)

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  9. 关于数据库SQL优化

    1.数据库访问优化   要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

随机推荐

  1. 在Visual Studio 中开发Office Add-in

    作者:陈希章 发表于2017年7月13日 "Talk is cheap, show me the code",我们就用代码来说话吧.这一篇将给大家介绍如何开始Office Add- ...

  2. 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

    在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...

  3. jQuery里使用setinterval

    如果第一个参数是一个已写好的函数而不是匿名代码块,一定不要加引号,直接var ** = setinterval{myFunction ,500},只能这样,加括号会直接只调用一次,自然不行,加引号和括 ...

  4. ms sql一些技巧

    1.SQL:复制数据库某一个表到另一个数据库中 SELECT * INTO 新表 FROM 旧表 (将旧表的结构和数据都复制到新表,不用事先创建新表) SELECT * INTO 新表 FROM 旧表 ...

  5. 【转载】Java系列笔记(3) - Java 内存区域和GC机制

    Java系列笔记(3) - Java 内存区域和GC机制 转载:原文地址http://www.cnblogs.com/zhguang/p/3257367.html 目录 Java垃圾回收概况 Java ...

  6. 【转】JAVA处理线程超时

    在实际业务中,由其是多线程并开业务中,经常会遇到某个线程执行超时.而程序如果不捕获这类情况,就会导致程序一直处于等待状态,从而影响后续线程的运行.比如说网络通迅.单任务下的复杂数据库查询等,通常处理这 ...

  7. json api

    from flask import Flask, redirect, url_for, jsonify, request app = Flask(__name__) users = [] ''' RE ...

  8. 为 Azure IoT Edge 设备部署 Azure Stream Analytics 服务

    在前面的两篇文章<Azure IoT Edge on Windows 10 IoT Core>和<Azure IoT Edge on Raspberry Pi 3 with Rasp ...

  9. PHP中静态方法和实例化方法的区别

    在PHP中类为什么要使用静态方法,有什么好处 不需要实例化?? 可以提高运行效率?? 这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写 ...

  10. 51nod 1203 jzplcm

    长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7.   例如:2 3 4 5,询问[1,3]区间的最小公倍数为2 ...