MySQL和Django在大批量删除会话时卡住

1 投票
4 回答
662 浏览
提问于 2025-04-16 15:57

我在用Django搭建网站,数据库用的是MySQL。现在我的django_session表里有300万条记录,其中大部分都是过期的,所以我想把它们删掉。不过,当我手动运行 delete from django_session where expire_date < "2011-04-18" 这个命令时,整个网站似乎就卡住了,浏览器无法访问。

为什么会出现这种卡住的情况呢?我该怎么避免呢?

4 个回答

0

你可以试试这个示例清理命令 - http://docs.djangoproject.com/en/dev/topics/http/sessions/?from=olddocs#clearing-the-session-table - 我觉得它可以删除所有过期的会话。

1

我不是MySQL的专家,但我猜MySQL在删除数据时会锁住表,这可能和MySQL的事务或后台处理有关。当删除操作进行时,MySQL会阻止其他连接访问这个表。MyISAM和InnoDB这两种存储引擎的表现可能会有所不同。我建议你查阅一下MySQL的手册,了解一下这个问题:这不仅仅是Django的问题,而是关于如何在不阻塞表访问的情况下删除MySQL中的行。

为了避免将来出现类似的问题,我建议你设置一个定期清理会话的任务,比如每天清理一次,这样就不会让表变得那么庞大了。

5

如果你的表是 MyISAM 类型,执行 DELETE 操作时会锁住整个表,这样其他查询就无法同时访问这个表。

如果要删除的记录很多,表会被锁很长时间。

可以把你的 DELETE 语句分成几个小批次来执行。

撰写回答