django.contrib.sessions.backends.cached_db
我有一个使用 MySQL 数据库后端配置后端的一年生产站点。我选择 cached_db 的原因是安全性和读取性能的结合。
问题是,负责删除所有过期会话的清理命令从未执行,导致会话表数据长度为 2.3GB,行数为 600 万,索引长度为 500Mb。
当我尝试运行./manage.py cleanup
(在 Django 1.3 中)命令或./manage.py clearsessions
(Django 的 1.5 通讯员)时,该过程永远不会结束(或者我的耐心没有完成 3 小时)。
Django 用来执行此操作的代码是:
Session.objects.filter(expire_date__lt=timezone.now()).delete()
在第一印象中,我认为这很正常,因为该表有 6M 行,但是,在我检查 System 的监视器后,我发现所有内存和 cpu 都被 python 进程使用,而不是 mysqld,填满了我机器的资源。我认为这个命令代码有一些可怕的错误。似乎 python 会遍历所有已建立的过期会话行,然后逐个删除它们。在这种情况下,将代码重构为原始DELETE FROM
命令可以解决我的问题并帮助 Django 社区,对吗?但是,如果是这种情况,那么 Queryset 删除命令会表现得很奇怪,并且在我看来没有经过优化。我对吗?