Django ORM 모델이 기본 mysqldb 보다 느린 이유는 무엇입니까?

먼저 MySQL 인덱스 문제를 확인합니다.

Mysql 에 들어가 색인을 찾아 색인을 작성하다.

Mysql & gt 는 SELECT sum(idate_count) FROM 을 해석합니까? Buzz_keyword_historyWHERE (? Buzz _ keyword _ 내역? 。 -응? 데이트? & lt2065 438+05-09-20 00: 00: 00' 및 buzz _ keyword _ history? 。 -응? 데이트? & gt =' 2015-09-0100: 00: 00' and buzz _ keyword _ history? 。 -응? 가치? =' 휴대폰');

+-+----+-----+--------+-----+--

| id | select _ type | table | type | possible _ key? | 열쇠? | key_len | ref? | 줄 | 추가? |

+-+----+-----+--------+-----+--

|? 1 | 단순함? | buzz_keyword_history | ref? | in_value, in_idate, search _ speed | in _ value |182 | const |/kloc-; Where 사용 |

+-+----+-----+--------+-----+--

65438+ 집합의 0 줄 (0.00 초)

그런 다음 MySQL 서버의 부하, 특히 부하를 살펴보았습니다.

컴퓨터 프로그래밍 언어

평균 CPU:? % 사용자? %nice %system %iowait? 훔친 거야? 유휴 백분율

-응? 2.80 0.001.22 0.410.00? 95.57

디바이스: rrqm/s? Wrqm/s r/s w/s? Rsec/s? Wsec/s avgrq-sz avgqu-sz? 기다려? Svctm? %util

Sdc? 0.00? 808.6 1? 2 1.65? 27.02? 553 1.93? 6685.05? 25 1.00 0.55? 1 1.39? 0.7 1? 3.45

깊은 발전? 0.00? 126.8 1 3.30 4.95? 823. 13? 1054.05? 227.75 0.37? 44.44? 1.50? 1.24

Sda? 0.06? 2 15.50 2.46 7.87? 599. 12? 1786.94? 231..10 0 0.81? 78.76? 1.37? 1.4 1

메디스카? 0.00 0.00? 585.63 2638.44 84515.95 21107.53 32.76 0.15 0.05? 0.03? 8.54

Dm-0? 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0 4.39? 1..13? 0.00

그런 다음 MySQL 서버에서 느린 쿼리 및 SQL 문 디버깅 모드를 켜고 slow.log 에 전용 로그가 없다는 것을 발견했습니다 ... 이 업무와 무관한 느린 쿼리입니다.

전체 페이지의 정적 파일도 정상적으로 로드되고 속도도 짱이다. Nginx 에는 강제 캐싱이 없지만 ... 그런데 왜 총 데이터 로드가 이렇게 느린가요?

마지막으로, 나는 다시 한번 MySQL query 를 의심해야 한다. 우리는 전체 django ORM 문에 소요된 시간을 계산하기 시작했다. 언뜻 보면 신기하게도 6 초가 걸렸는데. 나는 django ORM 이 단지 SQL 문을 매핑하는 것을 도와준 줄 알았다. 솔직히 말해서, 나는 이전에 정말 그렇게 생각했다.

컴퓨터 프로그래밍 언어

Run _ func.objects.filter (date _ _ GTE = d [0], date__lt=d[ 1]) 합계 (합계 (idate _ or _ cdate+'_ count'))

나는 django ORM 모델의 소개를 다시 한 번 보았다. 이 django 모델은 간단하지 않습니다. 반환 값은 querysets 유형입니다. 즉, 그는 ORM 실행 결과를 queryset 구조로 변환할 것이다. 이렇게 캡슐화되어 있어서 ORM 을 사용할 때마다 우리는 매우 친절하다고 느낍니다.

해결 방법은 기본 MySQL SQL 문을 직접 사용하는 것입니다. 파이썬 아래의 mysqldb 를 선택하거나 django 연결을 사용할 수 있습니다. 각 개인의 db 주소 구성이 settings.config 에 있기 때문에 연결을 권장합니다.

다음은 django 가 원본 SQL 문을 실행하는 방법입니다. .....

컴퓨터 프로그래밍 언어

Django.db 에서 연결 가져오기, 트랜잭션

MySQLdb 가져오기

.....

Cursor = connection.cursor (cursorclass = mysqldb.cursors.dictcursor)

Cursor.execute(sql, 없음)

데이터베이스가 여러 개 있는 경우 연결에서 데이터베이스를 선택할 수 있습니다.

Django.db 에서 연결 가져오기

커서 = 연결 ['쇼와']. 커서 ()

Transaction.commit _ unless _ managed (=' 쇼와' 사용)

따라서 기본 SQL 문을 사용하는 데 1 초 미만이고 django 를 사용하는 ORM 에는 약 6 초가 소요됩니다. 몇 배나 빨라졌습니다 ...

저는 django ORM 이 추가 매개변수를 queryset 으로 변환해야 하는지 여부를 추가해서 필요에 따라 구성할 수 있다고 생각합니다. -응? 다음은 제가 django debug 를 사용한 결과입니다 .. 속도가 많이 향상되었다는 것을 알 수 있습니다.