[終了]n+1問題の解決

2261 ワード

  • queryset怠け者!すぐに実行しない
  • 外部キーで表示するデータは、
  • を取得するためにqueryを再実行する必要がある.

    N+1 Query問題


    1) N+1 Query


    1つのクエリーで生成された結果リストをループし、結果リストの各結果に対して別のクエリーを実行します.
    result_list = query_result
    for r in result_list:
    	# query 수행

    2) 2N+1 Query



    3) NM+N+1 Query


    N+1 Query「解決」ツール


    select related同じクエリーで取得
    prefetch related second queryの使用

    1) select_related()


    1:1または1:M関係でのみ有効(M:M関係でプリフェッチrelatedを使用)
    繰り返し可能

    2) prefetch_related()


    繰り返しなし

    3) django-auto-prefetch


    N+1 Query「予測」ツール


    1) Django-debug-toolbar


    2) nplusone


    3) Scout APM


    好奇心がある


    django chained relation

    障害照会の確認


    Reference

  • https://scoutapm.com/blog/django-and-the-n1-queries-problem
  • When QuerySets are evaluated ( https://docs.djangoproject.com/en/3.1/ref/models/querysets/#when-querysets-are-evaluated )
  • https://soniacomp.medium.com/python-%EC%9C%BC%EB%A1%9C-db-%EB%8B%A4%EB%A3%A8%EB%8A%94-%EB%B2%95-%EC%9E%A5%EA%B3%A0-orm-c566717c49ba
  • http://www.incodom.kr/Django_ORM
  • https://leffept.tistory.com/312
  • https://leffept.tistory.com/314?category=950490
  • https://leffept.tistory.com/316?category=950490