はじめに 弊社では、Djangoを利用したサービスを開発・運用しており、その中で大規模な速度改善を行いました。 その際に実施した施策の解説とハマりポイントの整理し、まとめようと思います。 解説に用いたソースはこちらです。 目次 N+1を駆逐 distinctは重い! 不要なPaginatorをやめる 以下のモデルをサンプルに解説します。 1. N+1を駆逐 解説 N+1とは、あるモデルのリストを参照するときにそのモデルと外部結合しているモデルの内容を参照しようとするときに発生します。 1:1もしくは、N:1の場合は、select_related、1:Nまたは、N:Nの関係性がある場合はprefetch_relatedを利用します。 サンプルで確認します。 select_relatedを利用しない場合 以下のように1000件のUserのGroupを参照します。 from query.mode