我试图在我的模型上加速查找。我有3个型号。
class sett(models.Model):
setid = models.IntegerField(primary_key=True)
block = models.ForeignKey(mapt, related_name='sett_block')
class data_parsed(models.Model):
setid = models.ForeignKey(sett, related_name='data_parsed_setid', primary_key=True, db_index = True)
setid_hash = models.CharField(max_length=100, db_index = True)
class unique_variables(models.Model):
setid = models.ForeignKey(sett, related_name='unique_variables_setid', db_index = True)
setid_hash = models.CharField(max_length=100, db_index = True)
最重要的是,sett有一个名为setid的主键,其中包括:
data_parsed,unique_variables有一个setid的外键
data_parsed:300万行
unique_variables:1300万行
然后我有一段代码试图迭代所有data_parsed对象。
def something_1():
timeNow = datetime.datetime.now()
for i in range(0,N) <---- N is predefined, and no less than 10
for contents in data_parsed.objects.all().iterator():
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)
data_parsed有几百万项,需要大约20秒才能完成,我认为这很快。
现在,因为setid是data_parsed和unique_variables上的相同字段。我可以使用data_parsed的foriegn键获取unique_variables中的项目。因此:
def something_2():
timeNow = datetime.datetime.now()
for i in range (0, N) <---- N is predefined, and no less than 10
for contents in data_parsed.objects.all().iterator():
try:
items = unique_variables.objects.get(setid = contents.setid)
except:
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)
然而,问题是这会突然耗费数小时的时间。因为我不能使用select_related,因为我不会回到设置,但实际上是从sett转移到unique_variables。
有没有办法加快获取此行为的项目?
答案 0 :(得分:3)
是的,您可以使用prefetch_related。我已经为您链接了文档。
def something_2():
timeNow = datetime.datetime.now()
for i in range (0, N) <---- N is predefined, and no less than 10
parsed_objects = data_parsed.objects.all().prefetch_related(
'setid__unique_variables_setid')
for contents in parsed_objects:
try:
items = list(contents.setid.unique_variables_setid.all())
except:
pass
timeEnd = datetime.datetime.now()
print str(timeEnd - timeNow)