【问题标题】:How can I speed up my python script?如何加快我的 python 脚本?
【发布时间】:2016-01-20 09:39:08
【问题描述】:

我有以下 python 脚本,它逐行读取文件并执行 mysql 更新查询。它非常慢,每个查询似乎需要超过 1 秒。知道为什么这么慢吗?

   with open(fname) as f:
        for line in f:
            line = line.rstrip()
            email, name  = line.split(':')[0], line.split(':')[-1]
            try:
                cursor.execute("UPDATE user SET name=%s WHERE email=%s", (name, email))
            except mariadb.Error as error:
                print("Error: {}".format(error))

【问题讨论】:

    标签: mysql sqlperformance


    【解决方案1】:

    您应该能够通过使用索引来解决性能问题:

    create index idx_user_email on user(email);
    

    1 秒的更新时间很长。

    【讨论】:

    • 哇,非常感谢您解决了这个问题。为列创建索引后,脚本运行得更快。非常感谢。
    • 除了索引,批量更新会不会更快?现在他正在为每一行触发一个更新查询。而是如果他进行批量更新,会不会有性能差异?
    • @Ymartin 。 . .除非表也有索引,否则批量更新(可能)不会解决问题。我不会去“批量更新”。相反,我会使用load data infile 将文件加载到表中,然后使用join 进行更新(连同索引)。
    • @GordonLinoff 。谢谢。很有帮助!
    【解决方案2】:

    您可以尝试使用多个线程。

    import threading
    
    with open(fname) as f:
    
        for line in f:
            line = line.rstrip()
            email, name  = line.split(':')[0], line.split(':')[-1]
            thread = threading.Thread(target=updateUser,  args=[name, email] )
            thread.start()
    
    
    def updateUser(name, email):
        try:
            cursor.execute("UPDATE user SET name=%s WHERE email=%s", (name, email))
        except mariadb.Error as error:
            print("Error: {}".format(error))
    

    它可以避免在查询数据库时浪费时间。因此,当数据库处理查询时,您的程序将准备另一个查询。

    【讨论】:

      【解决方案3】:

      如果你想变得狂热,你也可以关闭日记功能:

      db= sqlite3.connect('database.db')
      cursor = db.cursor()
      cursor.execute("PRAGMA synchronous = OFF")
      cursor.execute("PRAGMA journal_mode = OFF")
      

      【讨论】:

        猜你喜欢
        • 2022-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多