我正在运行一个Web服务,用户在其中发送一个单词作为请求,我用这个单词来过滤数据库中的条目(默认的Django SQLite(。词条的关系词是一对一的。这意味着有两种可能的情况:
- 该词存在于数据库中->返回关联的
Entry
- 该词不存在->引发异常
下面的查找应该返回一个包含1或0个对象的QuerySet:
Entry.objects.filter(word__iexact=word)
预期行为:
情况1和情况2在速度上没有明显差异。
当前行为:
- 情况1最多需要半秒钟
- 案例2需要很长时间,大约1-2分钟
我觉得这令人费解。如果可以查找现有的word
,而不管它在数据库中的什么位置,那么为什么情况2需要很长时间?我不是django或数据库专家,所以我觉得我在这里错过了一些东西。是否值得建立一个不同类型的数据库,看看这是否有帮助?
这是我的代码的相关部分。我正在定义一个从视图调用的辅助函数:
mysite/myapp/utils.py
from .models import Entry
def get_entry(word):
if Entry.objects.filter(word__iexact=word).exists():
queryset = Entry.objects.filter(
word__iexact=word
) # Case insensitive exact lookup
entry = queryset[0] # Retrieve entry from queryset
return entry
else:
raise IndexError
这很正常,尤其是在sqlite上有几百万条记录的情况下,我假设没有索引。
如果没有可用的索引,则丢失的单词总是必须遍历所有记录。找到的单词一旦找到就会终止。如果您要查找的单词是表顺序中的最后一个单词,则没有明显的区别。
实际上,这是因为您正在使用切片,所以切片使用LIMIT,数据库可以停止查看第一个匹配项。