Drupal的Views是个非常强大、灵活的工具,但用得不合适也可能导致数据库负载的飙升。最近把Drupal站启用UTF8MB4支持,转换程序自动把以前的MyISAM引擎转为InnoDB了,也因此引起阿里云RDS的IOPS升高。
又试了一些调整RDS参数等,无效。再看了一些资料、观察了RDS的进程,还是一些Views的消耗大,特别是数据量大的站。以前在Drupal 6时就在个别网站中启用过views_litepager这个插件,来替换Views本身的翻页,牺牲了查看一共有多少页的功能,不再运行select count(*) ... 这个在InnoDB引擎消耗很大的数据统计,换来性能上的提升。
今天再次在一些Drupal 7站上实施了这个模块,不过发现设置有缓存的views翻页出现问题,类似别人的问题帖子:《Going back to "Page 1" displays "Page 0" in pager》,使用其中说到的补丁可以解决。
再观察看看,有效、没有其它问题的话,再实施到更多站点上去。
2017年11月6日补充:从MySQL的表现数据来看,views不显示页面总数后对降低IOPS确实有明显效果。已经在多个系列网站中实施,有几点注意:
- 对于数据量太少的网站(例如页面总数在几千、几万以下)或者数据量太小的Views(例如Taxonomy Term的分类页)来说,实施的意义不大,可以不变,有些网站总页面node数量大,但没有node的views,只有分类页的views,也可以不实施;
- 对于数据量较大的网站(例如页面数量在数万、数十万以上),而且有node做成的views的情况下,就有必要启用views_litepager模块并修改views中的翻页设置为litepager;
- 使用了自定义模块的网站,可以直接修改default views文件,将pager的数据从full改为lite,然后批量清理缓存;
- 多语言翻译中需要人工来增加Page 1和Page @count的对应翻译,以免当前页都是显示英语页数。
评论