Python提高更新数据库数据的速率的一种方法

Python提高更新数据库数据的速率的一种方法

常规更新数据库数据方法

我一开始用的更新数据库数据的方式是使用UPDATE更新,这段代码如下:

for i in ids:
	sql = "UPDATE " + tables + " SET " + tables + " =%s where id =%s" % (values[i],i)
    cursor.execute(sql)
#提交到数据库执行
db.commit()

更新速率如下(以更新8192个数据为例):
更新速率1
更新速率极其慢,一开始居然用了198s,对于需要绘制动态图的我来讲,这更新速度远远不够,于是我就开始不断尝试其他更新方法,经过好几天的探索,终于找到了新的方法。

提高数据库更新速率的方法

最终我选择了通过INSERT的方式更新数据库数据,直接上代码:

#SQL插入语句
sql = "DELETE " + tables + " FROM " + tables
cursor.execute(sql)
sql = "insert into " + tables + " values(%s,%s)"
cursor.executemany(sql, [(values[i],i) for i in ids ])
#提交到数据库执行
db.commit()

更新速率如下(以更新8192个数据为例):
更新速率2
第二种方式相比于第一种方式,速率得到大幅的提升,0.14s VS 198s。
下面给出常规方法的完整代码:

import pymysql
import numpy as np
import time
import random
import data_updata
import threading 
#打开数据库连接
#---------数据库中的频谱数据先插入8192个数据,以防更新无数据导致失败-------
db = pymysql.connect(
    host = 'localhost',
    user = 'root',  password = '',
    database = 'speech',
    charset = "utf8")
#使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
#清空数据库中频谱数据
sql = "set GLOBAL max_connections=32000"
cursor.execute(sql.encode('utf8'))
sql = "DELETE freqplot_data1 FROM freqplot_data1"
cursor.execute(sql.encode('utf8'))
print('数据库中频谱数据已清空')
#插入8192个索引
for i in range(8192):
    sql = "INSERT INTO freqplot_data1(id) VALUES(%s)"%(i)
    cursor.execute(sql.encode('utf8'))
print('数据库中频谱数据索引已建立')
db.commit()
db.close()
#----------------------------------------------------------------------------------------
def data_updata(tables, values, ids):
    db = pymysql.connect(
        host = 'localhost',
        user = 'root',  password = '',
        database = 'speech',
        charset = "utf8")
    cursor = db.cursor()
    #SQL插入语句
    #sql = "DELETE " + tables + " FROM " + tables
    #cursor.execute(sql)
    for i in ids:
        sql = "UPDATE " + tables + " SET " + tables + " =%s where id =%s" % (values[i],i)
        cursor.execute(sql)
        #提交到数据库执行
    db.commit()
    cursor.close()
    db.close()
def main():
    x = []
    for i in range(8192):
        l = random.uniform(88.5,108.5)
        l = round(l,1)
        x.append(l)
    data_updata('freqplot_data1', x, range(8192))
while 1:
    start_time = time.time()
    main()
    end_time = time.time()
    print(end_time-start_time)
    print('-------')

提高后的完整代码:

import pymysql
import numpy as np
import time
import random
import data_updata
import threading 
#打开数据库连接
#---------数据库中的频谱数据先插入8192个数据,以防更新无数据导致失败-------
db = pymysql.connect(
    host = 'localhost',
    user = 'root',  password = '',
    database = 'speech',
    charset = "utf8")
#使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
#清空数据库中频谱数据
sql = "set GLOBAL max_connections=32000"
cursor.execute(sql.encode('utf8'))
sql = "DELETE freqplot_data1 FROM freqplot_data1"
cursor.execute(sql.encode('utf8'))
print('数据库中频谱数据已清空')
#插入8192个索引
for i in range(8192):
    sql = "INSERT INTO freqplot_data1(id) VALUES(%s)"%(i)
    cursor.execute(sql.encode('utf8'))
print('数据库中频谱数据索引已建立')
db.commit()
db.close()
#----------------------------------------------------------------------------------------
def data_updata(tables, values, ids):
    db = pymysql.connect(
        host = 'localhost',
        user = 'root',  password = '',
        database = 'speech',
        charset = "utf8")
    cursor = db.cursor()
    #SQL插入语句
    sql = "DELETE " + tables + " FROM " + tables
    cursor.execute(sql)
    sql = "insert into " + tables + " values(%s,%s)"
    cursor.executemany(sql, [(values[i],i) for i in ids ])
        #提交到数据库执行
    db.commit()
    cursor.close()
    db.close()
def main():
    x = []
    for i in range(8192):
        l = random.uniform(88.5,108.5)
        l = round(l,1)
        x.append(l)
    print(x[3])
    try:
        data_updata('freqplot_data1', x, range(8192))
    except:
        print('数据上传失败')
while 1:
    start_time = time.time()
    main()
    end_time = time.time()
    print(end_time-start_time)
    print('-------')
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python更新数据库方法主要取决于你使用的数据库类型。下面是一些常见的数据库类型及其更新方法: 1. MySQL 使用Python更新MySQL数据库需要使用MySQLdb或者PyMySQL模块。以下是一个示例代码: ``` import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","testdb" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close() ``` 2. SQLite 使用Python更新SQLite数据库需要使用sqlite3模块。以下是一个示例代码: ``` import sqlite3 # 连接数据库 conn = sqlite3.connect('example.db') # 创建一个游标对象 c = conn.cursor() # 执行更新操作 c.execute("UPDATE user SET age = 23 WHERE name = 'Tom'") # 提交事务 conn.commit() # 关闭连接 conn.close() ``` 3. PostgreSQL 使用Python更新PostgreSQL数据库需要使用psycopg2模块。以下是一个示例代码: ``` import psycopg2 # 连接数据库 conn = psycopg2.connect(database="testdb", user="testuser", password="test123", host="localhost", port="5432") # 创建一个游标对象 cur = conn.cursor() # 执行更新操作 cur.execute("UPDATE employee SET age = age + 1 WHERE sex = 'M'") # 提交事务 conn.commit() # 关闭连接 conn.close() ``` 以上是三种常见数据库类型的更新方法示例,具体实现方式需要根据自己的需求和情况来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值