首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python MySQLdb的响应时间在silmiliar集上非常不同

Python MySQLdb的响应时间在silmiliar集上非常不同
EN

Stack Overflow用户
提问于 2016-07-21 08:29:26
回答 0查看 71关注 0票数 0

我正在使用Python+MySQLdb设计一个crontab作业,用于从MySQL中提取数据,生成XML文件并将其压缩。是的,这是一个归档任务发生在每天中午。

我的代码:

代码语言:javascript
复制
#!/usr/bin/env python
#encoding: utf-8
from dmconfig import DmConf
#from dmdb import Dmdb
import redis
import MySQLdb
import dawnutils


import time
from datetime import datetime, timedelta, date

conf = DmConf().loadConf()

db = MySQLdb.connect(host=conf["DbHost"],user=conf['DbAccount'],passwd=conf['DbPassword'],\
        db=conf['DbName'],charset=conf['DbCharset'])
cache = redis.Redis(host=conf['RedisHost'], port=conf['RedisPort'], 
        db=conf['Redisdbid'], password=conf['RedisPassword'])

#cursor = db.cursor()

def try_reconnect(conn):
    try:
        conn.ping()
    except:
        conn = MySQLdb.connect(host=conf["DbHost"],user=conf['DbAccount'],passwd=conf['DbPassword'],\
            db=conf['DbName'],charset=conf['DbCharset'])


def zip_task(device, start, stop):
    #cursor = db.cursor()
    format = "%Y%m%d%H%M%S"
    begin = time.strftime("%Y-%m-%d %H:%M:%S",time.strptime(start,format))
    end = time.strftime("%Y-%m-%d %H:%M:%S",time.strptime(stop,format))
    print "%s (%s,%s)"%(device, begin, end)
    sql = "SELECT * from `period` WHERE `snrCode` = \"%s\" AND `time` > \"%s\" AND `time` < \"%s\" ORDER BY `recId` DESC"%(device, begin, end)
    print sql
    cursor = db.cursor()

    try_reconnect(db)
    t1 = time.time()
    try:
        cursor.execute(sql)
        results = cursor.fetchall()
    except MySQLdb.Error,e:
        print "Error %s"%(e)

    print ("SQL takes %f seconds"%(time.time()-t1))

    print ("len of reconds, %d"%len(results))

    #for row in results:
        #print row


def dispatcher(devSet, start, stop):
    print "size of set: %d"%len(devSet)
    print devSet
    for dev in devSet:
        zip_task(dev, start, stop)

def archive_task_queue():
    today = datetime.now()
    oneday = timedelta(days=1)
    yesterday = today - oneday
    format = "%Y%m%d%H%M%S"
    begin = time.strftime(format, yesterday.timetuple())[:8] + '120000'
    end = time.strftime(format, today.timetuple())[:8] + '120000'

    sql = "SELECT * from `logbook` WHERE `login` > \"%s\" AND `login` < \"%s\" AND `logout` > \"%s\" AND `logout` < \"%s\""%(begin, end, begin, end)
    print sql

    cursor = db.cursor()
    reclist = []
    try:
        cursor.execute(sql)
        results = cursor.fetchall()

        for row in results:
            #print row
            reclist.append(row[1])
    except MySQLdb.Error,e:
        print "Error %s"%(e)

    #reclist = [u'A2H300001']

    if len(reclist):
        dispatcher(set(reclist), begin, end)

    db.close()

if __name__ == '__main__':
    archive_task_queue()

在我的代码中,我将查询设备活动的日志,并获取当天的活动设备集。并逐个查询每个设备的数据集。问题伴随着第二阶段的查询而来。运行以下命令后查看我的控制台:

代码语言:javascript
复制
SELECT * from `logbook` WHERE `login` > "20160720120000" AND `login` < "20160721                                                                     120000" AND `logout` > "20160720120000" AND `logout` < "20160721120000"
size of set: 4
set([u'B1H700001', u'B1H700002', u'A1E500018', u'A2H300001'])
B1H700001 (2016-07-20 12:00:00,2016-07-21 12:00:00)
SELECT * from `period` WHERE `snrCode` = "B1H700001" AND `time` > "2016-07-20 12                                                                     :00:00" AND `time` < "2016-07-21 12:00:00" ORDER BY `recId` DESC
SQL takes 0.018232 seconds
len of reconds, 597
B1H700002 (2016-07-20 12:00:00,2016-07-21 12:00:00)
SELECT * from `period` WHERE `snrCode` = "B1H700002" AND `time` > "2016-07-20 12                                                                     :00:00" AND `time` < "2016-07-21 12:00:00" ORDER BY `recId` DESC
SQL takes 0.974020 seconds
len of reconds, 4642
A1E500018 (2016-07-20 12:00:00,2016-07-21 12:00:00)
SELECT * from `period` WHERE `snrCode` = "A1E500018" AND `time` > "2016-07-20 12                                                                     :00:00" AND `time` < "2016-07-21 12:00:00" ORDER BY `recId` DESC
SQL takes 0.342373 seconds
len of reconds, 0
A2H300001 (2016-07-20 12:00:00,2016-07-21 12:00:00)
SELECT * from `period` WHERE `snrCode` = "A2H300001" AND `time` > "2016-07-20 12                                                                     :00:00" AND `time` < "2016-07-21 12:00:00" ORDER BY `recId` DESC

SQL takes 68.173677 seconds
len of reconds, 5794

查询时间异常。B1H700002 4642数据点需要0.9s,而A2H300001 5764数据点需要68秒。

然后,我将我的问题缩小到只查询特定的设备ID,这可以在我之前的代码中找到。结果是一样的。该查询需要65秒。

有什么线索吗?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38492932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档