最近还在设法降低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数量》。
评论