通过排序或索引提高 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_type,rec_value 或 rec_prop1 ?给定 rec_value 已经排序并且 rec_type 具有不平衡分布和一些可能的值而rec_prop1一般不过滤?在我的案例中,有什么方法可以进一步提高查询功能的性能吗?我仍在学习 Django 和数据库。非常感谢您的建议和帮助。非常感谢。
我最近在继续优化代码。首先,我发现代码
search_set.count == 0
可以优化为:
search_set.exists()
这显着提高了性能。 (搜索时间从 7 秒到 2.3 秒)。
其次,索引似乎对性能影响不大。
我正在从事一个项目,其中大约 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_type,rec_value 或 rec_prop1 ?给定 rec_value 已经排序并且 rec_type 具有不平衡分布和一些可能的值而rec_prop1一般不过滤?在我的案例中,有什么方法可以进一步提高查询功能的性能吗?我仍在学习 Django 和数据库。非常感谢您的建议和帮助。非常感谢。
我最近在继续优化代码。首先,我发现代码
search_set.count == 0
可以优化为:
search_set.exists()
这显着提高了性能。 (搜索时间从 7 秒到 2.3 秒)。 其次,索引似乎对性能影响不大。