问题描述
对于大量帖子,仅使用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个字段来避免数据库页面查找,这样查询可以直接从索引中完成。这样会增加插入和更新的开销,并且插入和更新的速度会变慢,但是读取速度会更快。