進入mysql,查索引,打索引。
mysql & gt解釋SELECT sum(idate_count) FROM?buzz_keyword_historyWHERE(?buzz _ keyword _歷史?。?約會?& lt2065 438+05-09-20 00:00:00 ' and buzz _ keyword _ history?。?約會?& gt= ' 2015-09-01 00: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 | 1514 |使用索引條件;使用where |
+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+
65438+集合中的0行(0.00秒)
然後我看了看mysql服務器的負載,尤其是負載下。
計算機編程語言
平均cpu:?%用戶?%nice %system %iowait?%偷?閑置百分比
?2.80 0.00 1.22 0.41 0.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.61 ?21.65 ?27.02 ?5531.93 ?6685.05 ?251.00 0.55 ?11.39 ?0.71 ?3.45
深發展?0.00 ?126.81 3.30 4.95 ?823.13 ?1054.05 ?227.75 0.37 ?44.44 ?1.50 ?1.24
sda?0.06 ?215.50 2.46 7.87 ?599.12 ?1786.94 ?231.10 0.81 ?78.76 ?1.37 ?1.41
梅迪斯卡?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.00 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],value=value)。聚合(Sum(idate_or_cdate + '_count '))
我又看了壹遍django orm模型的介紹。這個django模型並不簡單,它的返回值是querysets類型。換句話說,他將把orm執行的結果轉換成queryset結構。因為是這樣封裝的,所以每次用orm的時候我們都覺得特別親切。
解決方案是直接使用原生mysql sql語句。可以選擇python下的mysqldb,也可以使用django的連接。建議連接,因為每個人的db地址配置都在settings.config中。
下面是django如何運行原始sql語句,供大家參考。..
計算機編程語言
從django.db導入連接,事務
導入MySQLdb
.......
cursor = connection . cursor(cursor class = mysqldb . cursors . dict cursor)
cursor.execute(sql,無)
如果有多個數據庫,可以在連接中選擇數據庫。
從django.db導入連接
光標=連接['肖睿']。光標()
transaction . commit _ unless _ managed(使用= '肖睿')
因此,使用原生sql語句不到1秒,而使用django的orm大約需要6秒。快了好幾倍...
我覺得django orm應該增加壹個附加參數是否應該轉換成queryset,這樣我們就可以根據需求進行配置了。?以下是我使用django debug的結果..妳可以看到速度提高了很多。