用Drupal等CMS系统来搭建网站的主要好处就是不用太关心程序、数据库等技术细节,把精力主要集中在网站内容本身。不过有些时候也不得不去关注这些技术问题,例如:无法用普通办法实现的功能、遇到速度性能瓶颈等。
以前在用Drupal搭建网站的时候,就注意到添加新的内容类型(Content Type)后,用CCK设置的字段一般是放在同一个数据库表中的,例如一个内容类型“名录”就有一个表“minglu”,而compan, address, postcode这些字段就都在minglu这个表中,后来在一个网站中添加多个内容类型的时候,发现如果有相同名字的字段(例如postcode),就不存放在各自的表中,而是新建一个专门的表content_field_postcode,把各个内容类型中的postcode都集中放在这个表中,用nid, vid来对应页面node。
不是很明白Drupal中这样做的用意,可能在某些内容类型多的情况下,可以减少一些设置的工作量吧。只要能正常使用,我也没有特别深究。
但最近有几个网站打开越来越慢,服务器越来越忙,导入保存数据超时报错。今天和同事一起检查,服务器上的MySQL资源占用明显过多,在PHPMyAdmin中观察进程,发现有很多带有Left Join的进程运行时间超长,而这些进程都是Views为了从不同的表中读取多个字段产生的。问了技术部同事,这种带有Left Join的进程比单表查询的效率肯定低了不少,但具体度量数据还不好说。
要是早知道会产生这样的问题,我们在导入多种内容类型的时候就应该把字段都定义为不同的名称,这样同一种内容类型中的所有数据都放在单表中,查询起来肯定快多了。但现在要想还原还很不容易,有个CCK Field Rename模块,但不知道是否能解决问题,如果直接在MySQL中操作也是可能还原的,只是更麻烦、复杂,有风险。
我们现在的办法是从其他方面减少Views的负载(例如减少输出字段、取消排序链接),并调整my.cnf中的一些参数,观察看看能否有效降低负载,如果实在不行的话,还要通过几个可能的办法来解决:CCK Field Rename扩展模块、直接MySQL中操作、还原成几个月前的老数据并重新定义和导入新数据。
评论