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

时间:2014-09-06 16:37:07

标签: python mysql

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

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 ...外面它一直比较慢..

1 个答案:

答案 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)

(请注意>=替换您的>