存在检查在 Django SQLite 中永远存在

Exists check takes forever in Django SQLite

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

  1. 该词存在于数据库中 -> Return 关联 Entry.
  2. 单词不存在 -> 抛出异常。

接下来的查找应该 return 一个包含 1 个或 0 个对象的查询集:

Entry.objects.filter(word__iexact=word)

预期行为:

情况 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 上有几百万条记录,我假设没有索引。

如果没有可用的索引,一个遗漏的单词将总是需要遍历 所有 条记录。找到的单词将在找到后终止。如果您要查找的词是 table 顺序中的最后一个词,则没有明显区别。

实际上是因为您使用的是切片,所以切片使用了 LIMIT 并且数据库可以停止查看第一个匹配项。