一回のdjango adminリストページを覚えて、問題の解決過程が遅くなります.

2656 ワード

背景
私はmysql表を持っています.8490579条の記録があります.リストページを読み込む時は遅いです.
解決プロセス
リストページのurlはhttp://xlawyer.aegis-info.com/admin/laws/lawsmodel/?code_id=d 54 e 794 d 011 bbf 9837 a 34228202 c 6、最初はcode_を通したと思いました.idチェックシートが遅くなりました.コードに対して.idというフィールドはインデックスを作成しますが、インデックスを作成した後、リストページはまだ遅いです.仕方がないです.django adminのソースコードを見始めました.まずルートを探して、django.ntrib.admin.site.get_を見つけました.この方法には一部のコードがあります.
画像:https://images-cdn.shimo.im/AqNA3pNCWcUwmxJh/django_admin.png.pngというコードはdjangoが起動したら、すべてのregisterのModelAdminからurlsを取得してルートに登録するという意味ですので、ModelAdminのurlsを探しています.親タイプModelAdminのget_を見つけました.urls方法:写真:https://images-cdn.shimo.im/r2KXwuY45NsN1DPG/django_admin 1.pngの中にコードがあります.
url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info),
これでリストページurl対応の処理viewが分かりました.ModelAdmin類のchaelist_です.ビューの方法
chaelistにいますviewでブレークポイントを設定してデバッグしたら、
cl = ChangeList(
    request, self.model, list_display,
    list_display_links, list_filter, self.date_hierarchy,
    search_fields, list_select_related, self.list_per_page,
    self.list_max_show_all, self.list_editable, self,
)
ここに引っ掛かりました.ChangeList類の実例化方法を見つけて、ブレークポイントを設定してデバッグを続けます.
最終的にdjango.com ntrib.admin.views.main.get_を見つけました.この方法でレレスレスは次のようなコードを発見しました.
# Get the total number of objects, with no admin filters applied.
if self.model_admin.show_full_result_count:
    full_result_count = self.root_queryset.count()
else:
    full_result_count = None
can_show_all = result_count <= self.list_max_show_all
multi_page = result_count > self.list_per_page
締め括りをつける
以前のmysqlに対するテストを通して、selelct count(*)from lawsearch_を発見しました.ローソンこの文は実行に時間がかかります.理由はここです.ローws Adminにインスタンス変数ショーを設定することによりフルウ.レスリングcount=Falseはリストページを読み込む時にtotalを計算することを避けて、リストページの速度が正常になったことを発見しました.
拡張
二種類の区切りの方式:強く第二種類を使うことを提案します.
  • はtotalを計算して、pageとpage_によってsize改ページ
  • pageによると、page_とsizeは次のデータを取得し、取得したデータの数とpage_を比較します.size
  • mysql select countが遅い問題はビットマップインデックスのカウントを使うのが一番早いです.B+数インデックス(普通の索引)を使うのは次で、性能の差は1桁以上もあります.