2012-09-07 3 views
0

페이지 로딩 속도에 문제가 있습니다.장고 최적화

이제 페이지로드에는 약 7 초가 걸리고 장고 처리는 2 ~ 3 초가 걸립니다.

분명히 비난하는 것은 페이지에 액세스 할 때 "장고 디버그 도구 모음"에 표시된 것처럼 아키텍처에 대한 지식이 부족하고 평균 50 개의 쿼리를 실행하지만 대부분의 쿼리는 "어제의 스냅 샷 (그룹) "또는"어제 이전에 일별 스냅 샷 (일별로 그룹화) "이 있으며 매번 업데이트 할 필요는 없습니다.

나는 메모리 캐싱을 사용하여 아이디어를 내고 있거나 준비 가능한 유형의 데이터를 위해 새 테이블을 만듭니다.

이런 종류의 문제에 대해 규칙이나 디자인 패턴이 있습니까?

샘플 쿼리 (나는 그들이 어제 데이터 또는 마지막 month`s 데이터에 때마다 쿼리 안 믿는)이 있습니다이 인터넷에 노출 될 수있는 생산 응용 프로그램의 경우

SELECT `sample_salestarget`.`id`, `sample_salestarget`.`country_id`,     `sample_salestarget`.`year`, `sample_salestarget`.`month`, `sample_salestarget`.`sales` FROM `sample_salestarget` WHERE (`sample_salestarget`.`country_id` = "abc" AND `sample_salestarget`.`month` = 8 AND `sample_salestarget`.`year` = 2012) 

SELECT `sample_dailysummary`.`id`, `sample_dailysummary`.`country_id`, `sample_dailysummary`.`date`, `sample_dailysummary`.`pv_day`, `sample_dailysummary`.`pv_week`, `sample_dailysummary`.`pv_month`, `sample_dailysummary`.`active_uu_day`, `sample_dailysummary`.`active_uu_week`, `sample_dailysummary`.`active_uu_month`, `sample_dailysummary`.`active_uu_7days`, `sample_dailysummary`.`active_uu_30days`, `sample_dailysummary`.`paid_uu_day`, `sample_dailysummary`.`paid_uu_week`, `sample_dailysummary`.`paid_uu_month`, `sample_dailysummary`.`sales_day`, `sample_dailysummary`.`sales_week`, `sample_dailysummary`.`sales_month`, `sample_dailysummary`.`register_uu_day`, `sample_dailysummary`.`register_uu_week`, `sample_dailysummary`.`register_uu_month`, `sample_dailysummary`.`pay_count_day`, `sample_dailysummary`.`pay_count_week`, `sample_dailysummary`.`pay_count_month`, `sample_dailysummary`.`total_user`, `sample_dailysummary`.`inv_access_uu`, `sample_dailysummary`.`inv_sender_uu`, `sample_dailysummary`.`inv_accepted_uu`, `sample_dailysummary`.`inv_send_count`, `sample_dailysummary`.`memo`, `sample_dailysummary`.`first_charge_uu` FROM `sample_dailysummary` WHERE `sample_dailysummary`.`date` = 2012-09-07 AND `sample_dailysummary`.`country_id` = "abc") 
+0

장고가 모든 검색어를 처리한다고 가정합니다. 'group by '은 꽤 느릴 수 있기 때문에, 일반적으로 –

+1

은 약간의 코드를 보여줍니다. –

+1

여러분을 도울 수있는 충분한 정보가 * 근처에 있습니다. 그러나 많은 사람들이 실수로 만들고 있다고 말할 수 있습니다. 디버그 툴바가 제시하는로드 시간은 다른 뷰 또는 동일한 뷰의 다른 반복과 관련된 컨텍스트에서만 관련이 있으며 페이지의 전반적인 실제 속도와 관련이없는 반복 * *입니다. 디버그 도구 모음은 처리 속도와 렌더링 속도를 크게 저하시킵니다. 디버그 툴바로로드하는 데 7 초가 걸리며 페이지가 없으면 1 초도 걸릴 수 있습니다. –

답변

2

이 필요합니다. 그러나 문제가 있습니다. 필요할 때마다 캐시를 ​​명시 적으로 무효화하는 것에 대한 동적 페이지에 대해서는 신중해야합니다. Memcached가와 함께

는 가능한 한 Django's session variables을 활용, 장고 ORM을 캐시의 아주 좋은 일을 또한

를 조회 johnny-cache을 시도합니다. (Memcached를 사용하는 경우 cached_db 세션 엔진을 사용해보십시오.) 세션을 통해 일관성을 유지하는 객체 (예 : 사용자 프로필 설정)를 저장할 수 있습니다. 이 방법을 사용하면 SQL 호출 수를 다시 줄일 수 있습니다.

그리고 정말로 빠른 pageloads가 필요한 경우 ... 아마도 페이지를로드 한 다음 비동기 적으로 Celery을 사용하여 SQL 문을 호출하고 AJAXy 방식으로 결과를로드 해보십시오.

+0

감사합니다. 캐싱, 세션 미들웨어 및 셀러리 (내가 가장 좋아하는)를 시도합니다! – suslov

2

을하고 당신이 적어도 그 대답을 재사용 해야하는 쿼리의 수를 줄일 수 없다, 나는 django가 memcached를 사용하여 램에 데이터베이스 결과를 저장하기 위해 DB 캐시에 내장 된 것을 제안 할 것이다. 이것이 로컬 애플 리케이션이라면 나는 django의 램 기반 캐시를 제안 할 것이다. memcached를한다 그 이유는 장고의하지만 장고의보다 더 많이 확장 할 수 것은 약간의 설정을 정말 당신을 위해 일을 속도를 높일 수 Memcached를 사용

Caching for Django

+0

감사합니다. 내 응용 프로그램은 인터넷에 노출되어 있습니다.DB 캐시에 memcached 대신 redis를 사용할 수 있습니까? – suslov

+0

Redis는 사용하지 않았지만 Django는 memcached를 지원합니다. – Jharwood