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

Improve Django database performance by oriding or index?

我正在从事一个项目,其中大约 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 元中对其进行排序 在模型中。 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 秒)。 其次,索引似乎对性能影响不大。