MySQL和Django在大批量删除会话时卡住
我在用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
语句分成几个小批次来执行。