2016-09-14 1 views
0

그래서, 이메일 목록이 250,000 개 이상인 것이 적당합니다.데이터베이스 작업 시간 단축 Django/Mysql

첫 번째 테이블에서 제거해야하는 (유효하지 않은 것으로 표시하는) 유효하지 않은 전자 메일 목록이 50,000 개가 넘는 다른 테이블이 있습니다. 이를 위해 각 루프에서 3-4 초가 걸리는 간단한 장고 기능을 실행했습니다. 코드는 다음과 같습니다.

def clean_list(): 
    id = 9 
    while id<40000: 
     i = Invalid.objects.get(id=id) 
     y = i.email.strip() 
     f = IndiList.objects.get(email__contains=y) 
     f.active = False 
     f.save() 
     id +=1 

더 좋은 방법은 무엇입니까? SQL 쿼리 또는 더 좋은 장고 코드 또는 다른 방법.

도움말!

답변

1

은 테스트되지 않은 : 장고하지 않을 경우, 다음이이해야 할 그에서 하위 쿼리를 구축 할만큼 똑똑 경우

IndiList.objects.filter(email__in=Invalid.objects.only('email').all()).update(active=False) 

나는 확실하지 않다 하나 대신 2 개의 쿼리를 생성하고 두 번째 SQL 쿼리 문자열에 50,000 개의 ID를 삽입하므로이 시점에서 원시 SQL을 사용하는 것이 훨씬 더 간단합니다.

from django.db import connection 

cursor = connection.cursor() 
cursor.execute = 'UPDATE indilist SET active=false WHERE email IN (SELECT email FROM invalid)' 
+0

바로 원시 SQL이 빠릅니다. – sprksh

1

살펴보고 싶은 몇 가지 최적화가 있습니다. 대신 각에 대한 GET을 통해 반복의 값 목록을 얻는 시도 개체 :

queryset = Invalid.objects.filter(id__range=(9,40000)) queryset_list = queryset.values_list('email' flat=True)

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values-list

다음 값 목록을 통해 반복 및 이메일에 갔지을()하고. 끝에서 당신은 또한 수행 할 수 있습니다 만 부울 필드를 업데이트합니다

f.active = False f.save(update_fields=['active'])

합니다. https://docs.djangoproject.com/en/1.10/ref/models/instances/#updating-attributes-based-on-existing-fields

또한 가능하면 id 또는 일부 다른 필드를 통해 개체를 .get()하는 방법을 찾으십시오.

IndiList.objects.filter(email__in=Invalid.objects.all().values_list('email', flat=True)).update(active=False) 

문제를 두 번째 접근 방식 :

0

약간의 반복 후에, 나는 보다 1000 배 빠른이 기능을 사용했다.

def clean_list3(): 
    pp = Invalid.objects.filter(id__gte=9) 
    listd = [oo.email.strip() for oo in pp] 
    for e in IndiList.objects.all(): 
     if e.email.strip() in listd: 
      e.active=False 
      e.save() 
      print(e.id) 

트릭은 내가 메모리에서의 검색어에 25 만 개체를 ​​저장하는 대신 데이터베이스마다 타격의, 간단합니다. 또한 잘못된 목록의 전자 메일 목록을 메모리에 저장합니다.

그리고 난 우리가 일치하는 이메일을 찾았을 때만 데이터베이스를 눌러야 비활성으로 저장했습니다.