gpt4 book ai didi

mysql - 通过排序或索引提高 Django 数据库性能?

转载 作者:行者123 更新时间:2023-11-29 15:49:40 25 4
gpt4 key购买 nike

我正在开发一个项目,其中 MySQL 数据库中保存了大约 300 万条记录。模型如下:

class Record(models.Model):
rec_type = models.CharField(...)
rec_value = models.FloatField(...)
rec_prop1 = models.CharField(...)
...other fields...

class Meta:
ordering = ['rec_value']

典型的查询包含一系列目标rec_value、特定的rec_type,有时还包含特定的rec_type rec_prop1。查询操作比添加记录操作更常用。

我的查询函数是这样写的:

def find_target(value_from,value_to,type=None,prop1=None):
search_set = Record.objects.all()
if type: #not None
search_set = search_set.filter(rec_type=type)
if search_set.count == 0:
return []
if prop1: #not None
search_set = search_set.filter(rec_prop1=type)
if search_set.count == 0:
return []

search_list = search_list.filter(rec_value__gte=value_from,rec_value__lte=value_to)
result_list = []

for rec in search_list.values(...): #only get useful fields
result_list.append(some_runtime_calculation_about_rec)

return result_list

该代码工作正常,但每次查询大约需要 7 秒。当前未使用索引。我想提高查询性能。我在互联网上搜索了解决方案并学会了使用 QuerySet.values() 和数据库索引。问题是 rec_type 字段只有 3 个可能的值(例如 A、B、C),并且大多数记录(大约 70%)属于其中之一他们(例如A)。 rec_value 字段在每个查询中都会被过滤,因此我将其在模型中的 class Meta 中进行排序。 rec_prop1 有大约 10 个可能的值,但在大多数查询中,它仍然是 None,这意味着不进行过滤。我的问题是,我应该索引 rec_typerec_valuerec_prop1 ?鉴于 rec_value 已经排序,且 rec_type 分布不平衡且有一些可能的值和 rec_prop1 通常不会被过滤?在我的例子中,有什么办法可以进一步提高查询功能的性能吗?我仍在学习 Django 和数据库。我非常感谢您的建议和帮助。非常感谢。

最佳答案

我最近在继续优化代码。首先,我发现代码

search_set.count == 0

可以优化为:

search_set.exists()

显着提高了性能。 (搜索时间从7秒缩短至2.3秒)。其次,索引似乎对性能影响不大。

关于mysql - 通过排序或索引提高 Django 数据库性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com