代码之家  ›  专栏  ›  技术社区  ›  dr jimbob

Django使用未显示的选定对象数分页CPU时间缩放

  •  2
  • dr jimbob  · 技术社区  · 15 年前

    我有一个简单的数据库,大约有3900个条目,使用一个带有django.views.generic.list_detail.object_list的泛型视图(通过paginate_by)来浏览数据库中的数据,但是有些查询非常慢。

    django optimization page .

    profiling middleware 长查询的绝大多数时间都花在数据库上:

             735924 function calls (702255 primitive calls) in 11.950 CPU seconds
    
       Ordered by: internal time, call count
    
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    35546/3976    4.118    0.000    9.585    0.002 /usr/local/lib/python2.6/dist-packages/django/db/models/query.py:1120(get_cached_row)
        30174    3.589    0.000    3.991    0.000 /usr/local/lib/python2.6/dist-packages/django/db/models/base.py:250(__init__)
    
     ---- By file ----
    
          tottime
    47.0%   3.669 /usr/local/lib/python2.6/dist-packages/django/db/models/base.py
     7.7%   0.601 /usr/local/lib/python2.6/dist-packages/django/db/models/options.py
     6.8%   0.531 /usr/local/lib/python2.6/dist-packages/django/db/models/query_utils.py
     6.6%   0.519 /usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py
     6.4%   0.496 /usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py
     5.0%   0.387 /usr/local/lib/python2.6/dist-packages/django/db/models/fields/__init__.py
     3.1%   0.244 /usr/local/lib/python2.6/dist-packages/django/db/backends/util.py
     2.9%   0.225 /usr/local/lib/python2.6/dist-packages/django/db/backends/__init__.py
     2.7%   0.213 /usr/local/lib/python2.6/dist-packages/django/db/models/query.py
     2.2%   0.171 /usr/local/lib/python2.6/dist-packages/django/dispatch/dispatcher.py
     1.7%   0.136 /usr/local/lib/python2.6/dist-packages/django/template/__init__.py
     1.7%   0.131 /usr/local/lib/python2.6/dist-packages/django/utils/datastructures.py
     1.1%   0.088 /usr/lib/python2.6/posixpath.py
     0.8%   0.066 /usr/local/lib/python2.6/dist-packages/django/db/utils.py
    ...
     ---- By group ---
    
          tottime
    89.5%   6.988 /usr/local/lib/python2.6/dist-packages/django/db
     3.6%   0.279 /usr/local/lib/python2.6/dist-packages/django/utils
    ...
    

    我可以理解为什么SQL查询可以随着所选条目的数量而扩展。但是,我不明白为什么剩余的CPU时间会受到影响。这非常违反直觉,我想知道是否有任何调试/分析技巧可以帮助我。

    将django-1.2.3与sqlite、python2.6、apache2 prefork一起使用(尽管切换到mpm worker并没有显著改变)。任何提示/技巧将非常感谢。内存使用似乎也不是一个因素(机器有2Gb的RAM,free说只使用了300Mb(另外还有600Mb的缓存),数据库和机器在同一台服务器上。

    发现了我的错误

    基本上有些愚蠢的东西,比如:

        if len(queryset) == 1:                                 
            return HttpResponseRedirect( fwd to object_detail url ...)
        return object_list(request, queryset=queryset, paginate_by=  ...)
    

    1 回复  |  直到 15 年前
        1
  •  3
  •   knutin    15 年前

    当django进行分页时,它将使用标准的QuerySet切片来获得结果,这意味着它将使用 LIMIT 和 OFFSET

    您可以查看ORM通过调用 str() 上 .query 查询集的属性:

        print MyModel.objects.all().query
        print MyModel.objects.all()[50:100].query
    

    EXPLAIN 查询并查看数据库正在尝试执行的操作。我猜你是在某个没有索引的字段上排序。 EXPLAIN QUERY PLAN 根据 http://www.sqlite.org/lang_explain.html