Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用id和其他字段查询与使用id查询并在查询后检查其他字段_Python_Django_Relational Database - Fatal编程技术网

Python 使用id和其他字段查询与使用id查询并在查询后检查其他字段

Python 使用id和其他字段查询与使用id查询并在查询后检查其他字段,python,django,relational-database,Python,Django,Relational Database,对于大量的帖子,只获取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的对象然后检查用户是否匹配会更快(因此更好),对吗

# 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获取帖子,id是主键。 您正在获取所有者和post_id。 虽然您没有在示例中显示它,但您可能正在使用post的其他字段(用于显示等)。 因此,很可能会获取主键索引,并且会进行数据库页面查找,因为主键索引没有所有者字段或其他查询字段

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


通常,如果一个表有M个字段,并且您正在查询N个字段(包括where子句中的所有字段),其中N比M小得多,那么您可以通过索引N个字段来避免数据库页面查找,以便直接从索引执行查询。这会增加插入和更新的开销,速度会变慢,但您的读取速度会更快。

谢谢您的回答。我指的是一个有很多行的表格,并对问题进行了编辑以澄清这一点。还是没有区别吗?我没有创建任何索引,但我不知道Django是否会自动创建索引。不,没关系。查询性能受数据量的限制。因此,如果希望使用id 12345发布,数据库引擎将必须查找12345的主键索引,以查找哪个db页包含该行,然后检查db缓存(如果该页存在)。如果页面不在缓存中,则必须将页面加载到缓存中,然后返回查询结果。我不知道Django是如何创建索引进行评论的。但看起来您的查询性能由数据量而不是查询字段决定。在任何情况下,您都是在获取数据,然后在应用程序中做出决定