当前位置

减少Drupal网站path查找数据库查询负载

James Qi 在 2017年11月15日 - 15:23 提交
内容摘要:最近还在设法降低Drupal网站的MySQL负载,前些天尝试了安装entity cache,一般情况下可以把一个页面的70-120个mysql查询减少10个左右,然后把memcache使用的内存从1G......

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

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符