【发布时间】: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_type,rec_value 还是 rec_prop1 ?鉴于 rec_value 已经排序并且 rec_type 具有不平衡分布和一些可能的值rec_prop1 通常没有过滤?在我的情况下,有什么方法可以进一步提高查询功能的性能?我还在学习 Django 和数据库。我非常感谢您的建议和帮助。非常感谢。
【问题讨论】:
标签: mysql django django-models django-database