我循环查询几个日期范围:
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 ...外面它一直比较慢..
答案 0 :(得分:1)
您的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)
这种策略还允许您在大于一小时的块中有效地处理数据,如果这对您的应用程序有帮助的话。在许多情况下,但并非所有情况下,查询意味着更少的查询。
你的一些时间里有多少行吗?这可能导致不可预测的表现。
最后,您的查询中有一个错误的错误。应该说这个......
WHERE ... AND date >= DATE_SUB(NOW(), INTERVAL %s HOUR)
(请注意>=
替换您的>
)