存在检查在 Django SQLite 中永远存在
Exists check takes forever in Django SQLite
我是 运行 一个网络服务,用户在其中发送一个词作为请求,我使用该词来过滤我的数据库(默认的 Django SQLite)中的条目。 word-to-entry 的关系是一对一的。
这意味着有两种可能的情况:
- 该词存在于数据库中 -> Return 关联
Entry
.
- 单词不存在 -> 抛出异常。
接下来的查找应该 return 一个包含 1 个或 0 个对象的查询集:
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 上有几百万条记录,我假设没有索引。
如果没有可用的索引,一个遗漏的单词将总是需要遍历 所有 条记录。找到的单词将在找到后终止。如果您要查找的词是 table 顺序中的最后一个词,则没有明显区别。
实际上是因为您使用的是切片,所以切片使用了 LIMIT 并且数据库可以停止查看第一个匹配项。
我是 运行 一个网络服务,用户在其中发送一个词作为请求,我使用该词来过滤我的数据库(默认的 Django SQLite)中的条目。 word-to-entry 的关系是一对一的。 这意味着有两种可能的情况:
- 该词存在于数据库中 -> Return 关联
Entry
. - 单词不存在 -> 抛出异常。
接下来的查找应该 return 一个包含 1 个或 0 个对象的查询集:
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 上有几百万条记录,我假设没有索引。
如果没有可用的索引,一个遗漏的单词将总是需要遍历 所有 条记录。找到的单词将在找到后终止。如果您要查找的词是 table 顺序中的最后一个词,则没有明显区别。
实际上是因为您使用的是切片,所以切片使用了 LIMIT 并且数据库可以停止查看第一个匹配项。