【问题标题】:Improve Django database performance by oriding or index?通过 oriding 或 index 提高 Django 数据库性能?
【发布时间】:2019-11-12 04:14:02
【问题描述】:

我正在开展一个项目,其中大约 300 万条记录保存在 MySQL 数据库中。模型是这样的:

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_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 秒。当前不使用索引。我想提高查询性能。我在 Internet 上搜索了解决方案并学会了使用 QuerySet.values() 和数据库索引。问题是 rec_type 字段只有 3 个可能的值(例如 A、B、C),并且大部分记录(大约 70%)属于其中一个他们(例如A)。 rec_value 字段在每个查询中都经过过滤,因此我在模型中的 class Meta 中对其进行了排序。 rec_prop1 有大约 10 个可能的值,但在大多数查询中,它仍然是 None,这意味着没有过滤。我的问题是,我应该索引 rec_typerec_value 还是 rec_prop1 ?鉴于 rec_value 已经排序并且 rec_type 具有不平衡分布和一些可能的值rec_prop1 通常没有过滤?在我的情况下,有什么方法可以进一步提高查询功能的性能?我还在学习 Django 和数据库。我非常感谢您的建议和帮助。非常感谢。

【问题讨论】:

    标签: mysql django django-models django-database


    【解决方案1】:

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

    search_set.count == 0
    

    可以优化为:

    search_set.exists()
    

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

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 2016-10-24
      • 2013-10-26
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      相关资源
      最近更新 更多