我有一年的生产站点配置了django.contrib.sessions.backends.cached_db
后端和MySQL dabatase后端。我选择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删除命令行为很奇怪,在我看来没有优化。我是对的吗?
由于