Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 14, 2011 18:44:20

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

Производительность скрипта

Всем, привет! Есть скрипт, очень важно чтобы он отрабатывал очень быстро, хочу показать может кто, что посоветует что и где и в каком месте лучше оптимизировать. Индексы в базе расставлены.

def mac_search(*args):
db = MySQLdb.connect(host="localhost",user="test",passwd="test",db="test")
cursor = db.cursor()
cursor.execute('SELECT * FROM ip_groups WHERE mac="%s" AND is_deleted=0;' %args[0].split()[0])
for j in cursor.fetchall():
cursor.execute("SELECT * FROM iptraffic_service_links WHERE ip_group_id=%s and is_deleted=0;" %j[1])
for j1 in cursor.fetchall():
cursor.execute("SELECT * FROM service_links WHERE id=%s AND is_deleted=0;" %j1[0])
for j2 in cursor.fetchall():
cursor.execute("SELECT * FROM accounts WHERE is_deleted=0 AND id=%s AND is_blocked=0;" %j2[2])
for j3 in cursor.fetchall():
cursor.execute("SELECT * FROM service_links WHERE account_id=%s AND is_deleted=0;" %j2[2])
for j4 in cursor.fetchall():
if j4[3]==465 or j4[3]==641:
cursor.execute("SELECT * FROM s_multicast WHERE service_id=%s AND %s>=ip_start AND %s<=ip_end;" %(j4[3],args[0].split()[1],args[0].split()[1]))
for j5 in cursor.fetchall():
return j5

db.close()


def authorize(p):
print "*** authorize ***"
radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize ***')
mac = "{0}:{1}:{2}:{3}:{4}:{5}".format(p[0][1][1:-1][:2],p[0][1][1:-1][2:4],p[0][1][1:-1][4:6],p[0][1][1:-1][6:8],p[0][1][1:-1][8:10],p[0][1][1:-1][10:12]).lower()
ipm = "{0}".format(struct.unpack("!I", socket.inet_aton(p[8][1]))[0])
data = "{0} {1}".format(mac,ipm)
g = mac_search(data)
if g:
print g
return radiusd.RLM_MODULE_OK
else:
return radiusd.RLM_MODULE_REJECT
результат
real 0m0.096s
user 0m0.064s
sys 0m0.032s



Офлайн

#2 Сен. 14, 2011 22:30:34

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Производительность скрипта

варианты:
1) слепить в 1 запрос, джойны и прочее
2) это получается дерево запросов, где все запросы выполняются последовательно - можно расспараллелить.
3) возможно переложить в key/value хранилище - зависит от типа данных

Офлайн

#3 Сен. 16, 2011 10:40:22

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

Производительность скрипта

Спасибо! джойн помог но не значительно, вообщем норма.



Офлайн

#4 Сен. 26, 2011 21:04:57

usmix
От:
Зарегистрирован: 2011-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Производительность скрипта

Еще одна рекомендация - постараться оформить в виде хранимой процедуры - тем самым уменьшить количество обращений (подключений) в базу от клиента (приложения). К тому же отладка SQL-скриптов будет легче.



Отредактировано (Сен. 26, 2011 21:14:21)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version