gpt4 book ai didi

python - Python 中的 Mysql 日期范围查询循环

转载 作者:行者123 更新时间:2023-11-29 00:09:50 25 4
gpt4 key购买 nike

我正在循环查询几个日期范围:

con = MySQLdb.connect(host='xxx.com', port=3306,user='user', passwd='pass', db='db')

intervals = 10
precision = 1

dateChunks = list()
for i in range(0,intervals,precision):
results = load_data_window(i,precision)
dateChunks.append(results)

def load_data_window(start,precision):
length = start + precision # <-- time period
limit = 20000
cur = con.cursor()
sql = "SELECT data FROM table WHERE date < DATE_SUB(NOW(), INTERVAL %s HOUR) AND date > DATE_SUB(NOW(), INTERVAL %s HOUR)"
cur.execute(sql,(start,length))
results = cur.fetchall()

它在前几个循环中以闪电般的速度运行,有时甚至是所有循环,但有时会出现严重的问题。从不同的地方在数据库上发生了其他操作......我可以做些什么来确保我的查询具有优先权吗?交易之类的东西?

######### 编辑

我确实注意到,如果我将 con = MSQLdb... 移到 load_data_window 函数内部,我会得到非常快的结果然后陷入困境,而如果我将 con = MSQLdb... 保留在外部它始终较慢.. .

最佳答案

您的date 列是否有索引?这样的索引可能对性能有很大帮助。如果您的查询速度逐渐变慢,则尤其如此:MySQL 可能正在扫描您的表,每隔一小时扫描得越来越远,寻找要返回的第一行。

看起来您正在为每个请求获取一个小时的数据,并运行 fetchall() 以一次性将所有数据放入您的 python 程序的 RAM 中。那是你要的吗?如果你有一个小时有很多结果,你可能会敲打你的 python 程序中的 RAM,强制垃圾收集甚至操作系统抖动。

您能否让您的 Python 程序遍历结果集中的行?这很可能会占用更少的 RAM。你可以这样做:http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchone.html

cur.execute(sql,(start,length))
for row in cur:
print(row)

如果这对您的应用程序有帮助,这种策略还可以让您高效地处理超过一个小时的数据 block 。在许多(但不是所有)情况下,更少的查询意味着更好的查询。

您的某些时间是否有更多行?这可能会导致不可预测的性能。

最后,您的查询中有一个差一错误。应该是这样的……

 WHERE ...  AND date >= DATE_SUB(NOW(), INTERVAL %s HOUR)

(注意 >= 替换了你的 >)

关于python - Python 中的 Mysql 日期范围查询循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com