今年4、5月份在用Drupal搭建英文版中國郵編網站China Postal Code的過程中,為了讓浏覽者更方便、更習慣,采用了CCK字段+Views展示的擴展模塊,并進行一系列的比較複雜的設置,例如多個computed計算字段、Views查詢中嵌套多級查詢,算是基本上能實現所希望的功能。
但當時就發現在性能上有很多的問題,通過Devel模塊的開啟,可以查看到一些Views查詢數據庫所用的時間非常長,需要幾十甚至幾百秒,常常令服務器負載過高而影響網站訪問。後來找了一個自動檢測MySQL進程的小腳本,當發現超過限定值的進程時就自動kill掉,這個辦法确實可行,但屬于治标不治本,沒有查到真實原因的情況下,不得已而為之,因為這樣還會影響用戶浏覽和搜索引擎機器人的爬取。
上個月在下半年搭建的新網站中添加了多種Views來方便提供給用戶更多功能,但很快就發現與上面這個站說的情況一樣,服務器負載明顯升高,MySQL的消耗很大,一些查詢需要的時間太長,同時有很多查詢的時候,服務器就無法處理得過來了。當時沒有辦法,隻有臨時去掉了這些Views提供的功能,還用Squid對這些網址進行了拒絕,并在robots.txt中設置了不要收錄這些網址。
上周英文中國郵編站所在服務器的負載情況更突出一些,和多位同事反複商量讨論,也咨詢外面高手,對這些Views的MySQL查詢語句進行了詳細分析。先是發現這些語句中有大量LEFT JOIN,因為多個字段不是存放在同一張表中,而是分布在多個表中,靠vid, nid來關聯,我認為這是最大的問題,于是花了兩天的時間來試驗修改MySQL中數據庫的結構,将一些字段合并到同一個表中(需要進行的工作步驟和代碼用另外一篇博文記錄)。
但花了很多時間做了以上工作後,發現以前查詢時間過長的Views依然表現和以前差不多,沒有得到明顯改善。隻有另外再想辦法了,前面在咨詢、商量中,别人也提出過字段的索引問題,昨天就在Views涉及到的字段上添加了Index,結果很快就發現效果非常明顯,查詢時間從幾十、幾百秒縮短到幾秒、十幾秒。經過一天的觀察,再也沒有出現服務器負載過高的情況了,等明天在周一訪問高峰期再觀察看看。如果證實了這種辦法有效,而且沒有其他負面作用,還可以推廣到其他需要的網站上去。
评论