DZ.*_*DZ. 2 django query-optimization django-models
在我的应用程序中优化查询的过程中,我发现了一些奇怪的东西 在代码的给定部分中,我将获得对象,更新一些值,然后保存.从理论上讲,这应该执行2个查询.但事实上它执行3个查询.我在获取对象时选择查询,在保存对象时选择2(另一个选择然后更新!).删除一个查询可能看起来很愚蠢.在这个特定的方法中,我正在更新许多对象,因此我保存的每个查询在数据库上的命中率都会降低1,并且应该加快方法的速度
通过检查查询,两个选择查询是不同的,第一个得到很多东西,并且由它执行的选择很简单.
这是示例代码:
myobject = room.myobjects.get(id=myobject_id) # one query executed here
myobject.color = color
myobject.shape = shape
myobject.place = place
myobject.save() # two queries executed here
Run Code Online (Sandbox Code Playgroud)
查询:
1) "SELECT `rooms_object`.`id`, `rooms_object`.`room_id`, ......FROM `rooms_object` WHERE (`rooms_object`.`id` = %s AND `rooms_object`.`room_id` = %s )"
2) "SELECT (1) AS `a` FROM `rooms_object` WHERE `rooms_object`.`id` = %s LIMIT 1"
3) "UPDATE ......this ones obvious"
Run Code Online (Sandbox Code Playgroud)
我希望save方法能够识别它已经拥有内存中的对象而且它不需要再次获取它......如果可能的话......
第二个查询实际上并没有再次下拉对象.id在执行UPDATE查询之前,它正在执行极其快速的"存在"检查.从该查询返回的所有内容都是单个1,并且该字段已编制索引,因此它应该非常高效.
他们选择以这种方式设计ORM的原因是,他们首先查看您的对象以查看它当前是否具有ID.如果是这样,他们会这样做,SELECT以确保它确实存在于数据库中.如果是,则执行更新.如果记录不存在,他们会执行INSERT.您可以通过创建对象来测试它,然后在不知道django的情况下从数据库中手动删除该行.然后打电话save()
这就是确保django保持一致性的方法.
如果它是一个新对象,您只能获得一个INSERT查询,因为它现在知道该对象没有id.