Django SQLite中的Exists检查需要花费很长时间



我正在运行一个Web服务,用户在其中发送一个单词作为请求,我用这个单词来过滤数据库中的条目(默认的Django SQLite(。词条的关系词是一对一的。这意味着有两种可能的情况:

  1. 该词存在于数据库中->返回关联的Entry
  2. 该词不存在->引发异常

下面的查找应该返回一个包含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,数据库可以停止查看第一个匹配项。

最新更新