【问题标题】:Python/Django/MySQL optimisationPython/Django/MySQL 优化
【发布时间】:2020-08-14 00:28:02
【问题描述】:

真的只是一个逻辑问题...我有一个脚本,它从 CSV 获取数据行,解析单元格值以统一数据并检查数据库是否存在键/主值,以便防止重复!目前,第一个 10-15k 条目相当快地提交到数据库,但随后它开始变得非常缓慢,因为数据库中有更多条目要检查重复项......当数据库中有 100k 行时提交速度大约是 1/sec 啊...

所以我的问题是,将数据单独提取和解析到 DB 提交过程(可能在基于类的脚本中还是??我可以在 csv 解析或 DB 提交中添加多处理)是否更有效?如果我只是交叉引用 1 个表和 1 个值,有更快的方法来检查数据库中的重复项吗??

非常感谢

库达

【问题讨论】:

    标签: python mysql django logic


    【解决方案1】:

    如果前 10-15k 个条目运行良好,则问题可能出在数据库查询上。您是否有合适的索引,数据库是否使用该索引?您可以使用EXPLAIN 语句来查看数据库在做什么,它是否实际使用了 Django 使用的特定查询的索引。

    如果表开始为空,在前几千行之后运行ANALYZE TABLE 也可能会有所帮助;当表为空时,查询优化器可能有过时的统计信息。为了检验这个假设,您可以在脚本运行时连接到数据库,当它开始变慢时,手动运行ANALYSE TABLE。如果它立即加速,则问题确实是过时的统计数据。

    至于数据库提交本身的优化,在您的情况下可能不是问题(因为前 10k 行执行良好),但一个方面是往返;对于每个查询,它都必须转到数据库并取回结果。如果数据库跨网络,这一点尤其明显。如果您需要加快速度,Django 有一个bulk_create() 方法可以一次插入许多行。但是,如果您这样做,如果您尝试插入数据库索引禁止的重复项,您只会收到整批行的错误;然后,您必须使用其他代码找到导致错误的特定行。

    【讨论】:

    • 感谢您的快速回复...不确定我是否能回答您的大部分问题。查询是 "check_entry = ("SELECT id FROM rrn WHERE rrn = %s") check_data = self.all_rrn[x] self.cursor.execute(check_entry, (check_data, )) rrnOutput = self.cursor.fetchone() 。 .....”如果有输出,我知道它是重复的......我怎么知道索引是什么,我可以在哪里运行分析表??
    • bulk_create 会很好,但是数据到处都是,最好在确保数据完整性后插入每个部分......也许我错了,我不知道,哈哈
    • 索引在数据库中;如果您还没有接触过数据库,并且rrn 不是主键,那么可能没有主键。您可以通过 Django 通过在字段定义中添加 db_index=True 来添加它(然后创建迁移并运行它,请参阅 Django 文档)。
    • 要连接到数据库,您可以使用命令行mysql 工具或GUI 界面之一。无论哪种方式,你给它相关的连接参数(类似于 Django 数据库配置),它连接到数据库,然后你可以运行手动查询和其他 SQL 命令,包括ANALYZE TABLE rrn。如果您以前没有使用过EXPLAIN,您可能需要查找解释结果的教程;阅读它们是它自己的技能。
    • 这很好,伙计,为数据库添加了一些索引(以及我稍微整理了插入语句),现在它正在以相当合理的速度前进,但最重要的是它并没有放慢速度所以....非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2016-01-15
    • 2017-01-01
    相关资源
    最近更新 更多