アプリでクエリを最適化する過程で、何か奇妙なことに気づきました。コードの特定のセクションで、オブジェクトを取得し、いくつかの値を更新してから保存します。理論的には、これは2つのクエリを実行する必要があります。しかし実際には、3つのクエリを実行しています。1オブジェクトを取得するときにクエリを選択し、2オブジェクトを保存するときにクエリを選択します(別の選択してから更新します!)。1つのクエリを削除している間、ばかげているように見えるかもしれません。この特定のメソッドでは、多くのオブジェクトを更新しているので、保存するすべてのクエリはデータベースでのヒットが1つ少なくなり、メソッドを高速化するはずです。
クエリの検査を通じて、2つのselectクエリは異なり、最初のクエリは多くのものを取得し、同じものによって実行されるselectは単純です。
サンプルコードは次のとおりです。
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
クエリ:
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"
saveメソッドに、オブジェクトがすでにメモリ内にあることを認識させたいので、再度取得する必要はありません。