千家信息网

Django项目优化数据库的示例分析

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍了Django项目优化数据库的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用 QuerySet.expla
千家信息网最后更新 2025年01月23日Django项目优化数据库的示例分析

这篇文章主要介绍了Django项目优化数据库的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

使用 QuerySet.explain() 来了解你的数据库是如何执行特定的 QuerySet 的。

你可能还想使用一个外部项目,比如 django-debug-toolbar ,或者一个直接监控数据库的工具。

合理的创建索引

索引可能有助于加快查询速度,但是也要注意索引会占用磁盘空间,创建不必要的索引只会形成浪费。数据库表中的主键、外键、唯一键默认会创建索引。
那么哪些字段需要创建索引呢?这是一个好的且令人疑惑的问题,下面列出的几条可以作为参照意见:

  • 频繁出现在WHERE条件子句的字段(也就是Django里filter筛选的字段)

  • 经常被用来分组(group by)或者排序(order by)的字段

  • 在经常存取的多个列上创建复合索引,但要注意复合索引的顺序要按照使用的频度来决定

class ModelName(models.Model):        # 字段添加索引使用db_index        name = models.CharField(db_index=True, max_length=100)        class Meta:                # 联合唯一索引使用index_together                index_together = ('字段1', '字段2')

设置数据库持久连接

减少SQL的执行次数

多次访问数据库比单次查询所有内容的效率低。因此理解并学会使用select_related() 和 prefetch_related() 。

select_related():创建一个 SQL 连接,并在 SELECT 语句中包含相关对象的字段。一般用于一对多(ForeignKey)和一对一(OneToOneField)关系

# 标准查询# Hits the database.e = Entry.objects.get(id=5)# Hits the database again to get the related Blog object.b = e.blog# select_related 查询# Hits the database.e = Entry.objects.select_related('blog').get(id=5)# Doesn't hit the database, because e.blog has been prepopulated# in the previous query.b = e.blog

prefetch_related():一般用于多对一(GenericForeignKey)和多对多(ManyToManyField)关系

from django.db import modelsclass Topping(models.Model):    name = models.CharField(max_length=30)class Pizza(models.Model):    name = models.CharField(max_length=50)    toppings = models.ManyToManyField(Topping)    def __str__(self):        return "%s (%s)" % (            self.name,            ", ".join(topping.name for topping in self.toppings.all()),        )# Goodpizza.objects.all().prefetch_related('toppings')

仅获取需要的字段数据

使用 QuerySet.values() 和 values_list()

使用 QuerySet.defer() 和 only()

使用 QuerySet.count()

使用 QuerySet.exists()

请不要过度使用 count() 和 exists()

使用批量创建、更新和删除,不随意对结果排序

批量创建: 当创建对象时,尽可能使用 bulk_create() 方法来减少 SQL 查询数量。比如:

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

批量更新: 当更新对象时,尽可能使用 bulk_update() 方法来减少 SQL 查询数。给定对象的列表或查询集:

# Goodentries[0].headline = 'This is not a test'entries[1].headline = 'This is no longer a test'Entry.objects.bulk_update(entries, ['headline'])# Badentries[0].headline = 'This is not a test'entries[0].save()entries[1].headline = 'This is no longer a test'entries[1].save()

批量插入: 当插入对象到 ManyToManyFields 时,使用带有多个对象的 add() 来减少 SQL 查询的数量。

举例:

# Goodmy_band.members.add(me, my_friend)# Badmy_band.members.add(me)my_band.members.add(my_friend)# GoodPizzaToppingRelationship = Pizza.toppings.throughPizzaToppingRelationship.objects.bulk_create([    PizzaToppingRelationship(pizza=my_pizza, topping=pepperoni),    PizzaToppingRelationship(pizza=your_pizza, topping=pepperoni),    PizzaToppingRelationship(pizza=your_pizza, topping=mushroom),], ignore_conflicts=True)# Badmy_pizza.toppings.add(pepperoni)your_pizza.toppings.add(pepperoni, mushroom)

批量删除: 当从 ManyToManyFields 删除对象时,可以使用带有多个对象的 remove() 来减少 SQL 查询的数量。

比如:

# Goodmy_band.members.remove(me, my_friend)# Badmy_band.members.remove(me)my_band.members.remove(my_friend)# Goodfrom django.db.models import QPizzaToppingRelationship = Pizza.toppings.throughPizzaToppingRelationship.objects.filter(    Q(pizza=my_pizza, topping=pepperoni) |    Q(pizza=your_pizza, topping=pepperoni) |    Q(pizza=your_pizza, topping=mushroom)).delete()# Badmy_pizza.toppings.remove(pepperoni)your_pizza.toppings.remove(pepperoni, mushroom)

感谢你能够认真阅读完这篇文章,希望小编分享的"Django项目优化数据库的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

索引 字段 查询 数据 对象 数据库 篇文章 项目 多个 数量 更新 示例 分析 尽可能 方法 排序 频繁 一对一 也就是 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 app开发九零部落软件开发 上海创视通录播服务器电话代理商 性能可靠语音会议软件开发 dell服务器报价 电子商务网络技术实训总结 公司网络安全的治理机制是什么 第六届网络安全等级保护技术大会 f2pool无法连接服务器 河南网络技术咨询报价 mcu软件开发做什么工作 世界第三服务器公司 网络安全模式不能安装软件吗 锡林郭勒盟软件开发 惠普服务器本机管理员密码 河南有软件开发的大学吗 燃烧的远征服务器人口普查小程序 数据库如何插入属性列的数据信息 通过网址可以查询服务器吗 我的世界幸运镇服务器 后端需要设置数据库 房山区网络技术服务职责 数据库安装好了没有域名怎么办 如何在云服务器上玩游戏 成都软件开发可靠青冈科技 电子零售软件开发 软件开发 新生代农民工 软件开发的最新趋势 软件开发的质量管理包括哪些内容 数据库应用和技术论文 申请软件开发
0