如何解决在MariaDB上使用SQLalchemy删除数百万行
我们有一个庞大的基础(〜1 To),数十亿行特别是在一个表中。 最近,我们不得不一次删除数以千万计的行,而这样做很麻烦。当进行此类删除时,查询会使用大量内存,这可能导致崩溃,也可能会出现锁定问题。这种删除将越来越多。
从今天起,我们使用以下代码删除行:
delete_query = myDB.__table__.delete().where(myDB.foreign_id.in_(foreign_ids_to_delete))
dbsession.execute(delete_query)
在那之后还有一个commit()
。
我考虑过添加一个限制,以按批删除,但是似乎这不是SQLAlchemy处理的。也许我可以在python方面做到这一点:例如,使用select获取要删除的所有ID,并按10000个批次删除它们。这可能会导致python方面的性能问题和内存问题。
synchronize_session
会成为内存如此之高的原因之一吗?
解决方法
MariaDB Connector / Python支持使用二进制协议和executemany()
方法的本机批量删除操作(在MariaDB 10.2中引入)。
由于MariaAl方言尚未包含在SQLAlchemy中(有一个打开的拉取请求),您可以使用简单的python脚本将其删除(表演示包含应删除的记录,表delete_keys是应删除的ID。
import mariadb
conn= mariadb.connect(database="testp")
conn.autocommit= False
cursor=conn.cursor()
# read ids which needs to be deleted
cursor.execute("select id from delete_keys")
ids=cursor.fetchall()
print("Deleting %s rows" % cursor.rowcount)
cursor.executemany("DELETE FROM demo WHERE id=?",ids)
conn.commit()
print("%s rows deleted" % cursor.rowcount)
删除2万行大约需要半秒钟(数据库服务器在同一台计算机上运行):
$ time python3.8 delkeys.py
Deleting 20000 rows
20000 rows deleted
real 0m0,535s
user 0m0,134s
sys 0m0,024s
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。