Django-数据库访问优化
数据库访问优化
使用标准数据库优化技巧
- 索引。我们可以使用Field.db_index或者Meta.index_together在Django中添加索引,优先向经常使用filter(),exclude(),order_b()等查询的字段添加索引,帮助我们更快的查找。
- 合理使用字段类型
了解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_save
和post_save
信号。 - 它不适用于多表继承场景中的子模型。
- 如果模型的主键是
AutoField
,则不会像save()
那样检索并设置主键属性,除非数据库后端支持(当前是PostgreSQL)。 - 它不适用于多对多关系。
这也可以用在ManyToManyField中,所以:
my_band.members.add(me, my_friend)
优于
my_band.members.add(me)
my_band.members.add(my_friend)
Django-数据库访问优化的更多相关文章
- Django 数据库访问性能优化
使用标准的数据库优化技术: 在进行Django数据库访问性能优化之前,首先应该使用标准的数据库技术对其进行优化,比如给字段加索引,通过使用 django.db.models.Field.db_inde ...
- 数据库访问优化漏斗法则- 四、减少数据库服务器CPU运算
数据库访问优化漏斗法则这个优化法则归纳为5个层次:1.减少数据访问次数(减少磁盘访问)2.返回更少数据(减少网络传输或磁盘访问)3.减少交互次数(减少网络传输)4.减少服务器CPU开销(减少CPU及内 ...
- 「Django」数据库访问优化
先做性能分析 - 两个工具 django.db.connection from django.db import connection# contextprint connection.queries ...
- Django数据库性能优化之 - 使用Python集合操作
前言 最近有个新需求: 人员基础信息(记作人员A),10w 某种类型的人员信息(记作人员B),1000 要求在后台上(Django Admin)分别展示:已录入A的人员B列表.未录入的人员B列表 团队 ...
- 数据库访问优化之四:减少数据库服务器CPU运算
1.使用绑定变量 绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值. 非绑定变量写法:Select * from employee where id=123456 ...
- 数据库访问性能优化 Oracle
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...
- Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转载)
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- 关于数据库SQL优化
1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...
随机推荐
- GPU版的tensorflow在windows上的安装时的错误解决方案
1.用vs编译cuda的sample时会提示找不到"d3dx9.h"."d3dx10.h"."d3dx11.h"头文件的错误,如果没有安装这 ...
- matplotlib简介及安装
官网介绍: Matplotlib is a Python 2D plotting library which produces publication quality figures in a var ...
- idea 配置热部署
1. 2.
- 解决model 里 NSInteger类型
#import "CJGWCListModel.h" @implementation CJGWCListModel - (NSInteger)goods_number{ if (_ ...
- 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复
1.虚拟机关机断电 2.添加硬盘 2.开机 3.fdisk -l查看刚才新添加的硬盘 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 2147483 ...
- 【JMeter】选项-函数助手对话框应用举例
String date="${__javaScript((new Date()).getFullYear()+'-'+((new Date()).getMonth()+1)+'-'+(new ...
- ubuntu16.04 查询ip,网关,dns信息
用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show
- [C#]获得WindowsForm上所有特定类型的控件
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- 原创js自动补全---auotocomplete
if ($("input.autocomplete_input").length > 0) { $("input.autocomplete_input") ...
- Linux命令每日一个
2014-3-31 1:39 (1)tree linux以树状的结构显示当前目录及其包含的子目录下的文件 #apt-get install tree #tree //在当前目录下直接使用该命令即可 ...