2014-09-06 2 views
1

Я цикл запросов несколько диапазонов дат:Mysql Диапазон дат запросов Петля в Python

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() 

Он работает молниеносно первые несколько петель, иногда даже все из них, но болота значительно время от времени. Есть другие действия, происходящие в базе данных из разных мест ... Есть ли что-то, что я могу сделать, чтобы гарантировать, что мой запрос имеет приоритет? Что-то вроде транзакции?

######### EDIT

я уведомление, если я перееду кон = MSQLdb ... внутри функции load_data_window, я получаю очень быстрые результаты, а затем заболачивания, в то время как, если я держу con = MSQLdb ... вне его последовательно медленнее ...

ответ

1

В вашей колонке date есть указатель на нее? Такой индекс может значительно помочь производительности. Это особенно верно, если ваши запросы постепенно замедляются: MySQL может просматривать вашу таблицу, все дальше и дальше в течение каждого следующего часа, ища первую строку для возврата.

Похоже, вы получаете данные о стоимости часа с каждым запросом и запускаете fetchall(), чтобы разбросать все эти данные в ОЗУ в вашей программе python сразу. Это то, что вы хотите? Если у вас есть час с большим количеством результатов, вы можете забивать RAM в вашей программе python, заставляя сборку мусора и даже обрушивать операционную систему.

Можете ли вы заставить свою программу python перебирать строки в наборе результатов? Это, скорее всего, займет намного меньше оперативной памяти. Вы можете сделать что-то вроде этого: 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) 

(Обратите внимание на >= замене >)

+0

Олли, спасибо за ваш вклад. Я даю вам точку для всех замечательных отзывов и предложений. Я оставляю вопрос открытым, на случай, если у кого-то появится больше информации. Это довольно открытый вопрос, так что спасибо за ваше время. –

Смежные вопросы