使用id和其他字段进行查询与使用id查询并在之后检查其他对象相比

问题描述

对于大量帖子,仅使用id捕获对象,然后检查用户是否匹配,这样更快(因此更好)?

# Option A
post = get_object_or_404(Post,id=post_id,owner=request.user)

# Option B
post = get_object_or_404(Post,id=post_id)
if post.owner != request.user:
    raise Http404()

解决方法

当您说大型数据库时,是指具有很多字段的“宽表”还是具有许多行的“大表”?

我假设您打算说包含很多字段的“宽表”。

数据库获取性能取决于几个因素:

  • 您要提取哪些列
  • 您要使用的查询,
  • 过滤条件
  • 数据库引擎使用的查询计划,
  • 是索引中已请求的列,还是需要获取数据库页面 等等,

您的示例涉及通过ID(即主键)获取帖子。 您正在获取所有者和post_id。 尽管在示例中未显示,但您可能会使用帖子的其他字段(用于显示等)。 因此,很可能将获取主键索引,并且也将有数据库页查找,因为PK索引没有所有者字段或其他查询的字段。

因此,无论使用选项A还是选项B,都将获得类似的性能。

通常,如果表有M个字段,并且您要查询N个字段(包括where子句中的所有字段),并且N比M小很多,则可以通过索引N个字段来避免数据库页面查找,这样查询可以直接从索引中完成。这样会增加插入和更新的开销,并且插入和更新的速度会变慢,但是读取速度会更快。