访问数据库速度

时间:2018-10-14 20:04:34

标签: python sqlite

我有一个简单的应用程序(Telegram bot),目前大约有2000-3000人在使用。

因此,我想每隔“ N”秒增加用户的余额。这取决于它们的当前状态。该代码可以正常工作,但是该功能可能会在一段时间后不起作用。我以30秒开始,但是在第一个问题之后,我认为30秒不足以遍历所有行并执行它。因此,现在我以1200秒的速度运行它,但是无论如何它会在一段时间后停止增长。

那是因为它还是我在代码本身中做错了什么?

P.S。我使用的是Python3和SQLite,并且该僵尸程序一直在廉价的弱VPS服务器上运行。

def balance_growth():
    try:
        cursor = connMembers.cursor()
        sql = "SELECT * FROM members"
        cursor.execute(sql)
        data = cursor.fetchall()
        for single_data in data:
            if single_data[5] == "Basic":
                sql = "UPDATE members SET balance = {B} + 1 WHERE chat_id = {I}".format(B=single_data[1], I=single_data[0])
                cursor.execute(sql)
            elif single_data[5] == "Bronze":
                sql = "UPDATE members SET balance = {B} + 2 WHERE chat_id = {I}".format(B=single_data[1], I=single_data[0])
                cursor.execute(sql)
            elif single_data[5] == "Silver":
                sql = "UPDATE members SET balance = {B} + 12 WHERE chat_id = {I}".format(B=single_data[1], I=single_data[0])
                cursor.execute(sql)
            elif single_data[5] == "Gold":
                sql = "UPDATE members SET balance = {B} + 121 WHERE chat_id = {I}".format(B=single_data[1], I=single_data[0])
                cursor.execute(sql)
            elif single_data[5] == "Platinum":
                sql = "UPDATE members SET balance = {B} + 1501 WHERE chat_id = {I}".format(B=single_data[1], I=single_data[0])
                cursor.execute(sql)

                cursor.execute(sql)
            connMembers.commit()
        cursor.close()

        t = threading.Timer(120, balance_growth).start()
    except Exception as err:
        print(err)

2 个答案:

答案 0 :(得分:1)

为什么不只在一个更新语句中而不是在每一行中都做呢?像

${vav}

编辑:

其他建议:

  • 在不同级别上使用整数而不是字符串,这样既可以更快地进行比较,又可以减少数据库中的空间。
  • 重新设计您的逻辑,以免每次更新都需要更新。也许像跟踪上次更新平衡表的记录,并根据需要检查平衡表之间的时间差来更新它。

答案 1 :(得分:0)

问题在于,您在每个UPDATE语句之后都调用commit(),这将迫使数据库从其缓存中写回所有更改。

完成所有操作后执行一次提交。