最近還在設法降低Drupal網站的MySQL負載,前些天嘗試了安裝entity cache,一般情況下可以把一個頁面的70-120個mysql查詢減少10個左右,然後把memcache使用的内存從1G增加到2G,應該會有一些幫助。
今天再次打開devel查詢,發現多語言網站的頁面中drupal_lookup_path特别多,50種語言就需要有50個這種查詢,而且每個查詢的語言代碼不同,不能很好利用MySQL的查詢緩存機制。
其實這個查詢語句:
SELECT alias FROM url_alias WHERE source = 'taxonomy/term/11' AND language IN ('ca', 'und') ORDER BY language ASC, pid DESC
中對應的語言代碼'ca'是可以去掉的,因為我們網站中每個source對應的alias其實都是一樣的,不存在單獨某種語言的alias不同的情況,如果去掉這個(後面的ORDER BY language也同樣去掉)就變成了:
SELECT alias FROM url_alias WHERE source = 'taxonomy/term/11' AND language = 'und' ORDER BY pid ASC
50種語言的查詢語句都一樣了,這樣MySQL的查詢緩存就可以起作用,速度加快很多;
沒有找到drupal hook可以修改drupal_lookup_path這個函數的地方,暫時直接修改了includs/path.inc這個文件來實現,從devel看确實減少了大量drupal_lookup_path查詢語句,甚至是沒有了,懷疑是被某種機制cache了。
另外,找到一個Path Cache模塊,這個模塊會給path.inc打個補丁,讓memcache來緩存path。還找到一個Cache Locale模塊,給核心模塊中的locale函數打補丁,然後設置DrupalCacheArray中的類來讓緩存起作用,好像也是會用到memcache。不過這兩個模塊使用的人都很少,我也暫時沒用,先把上面path.inc改了看看效果。
2017年11月20日補充:以上直接改動Drupal核心文件的辦法不是很妥當,後來采用了别的辦法,請看博文《Drupal中自定義語言切換Block,減少頁面SQL數量》。
评论