MountLion 发表于 2012-9-24 14:36:49

TestLink的性能软肋

研究了一段Testlink(1.9.3),我认为它的设计确实无法胜任大数据量(十万案例十万Bug)。哪些地方有问题呢?

1、树形查询
TestLink(在大数据量下)性能最糟糕的地方,在于它的树形查询。多个功能都涉及树形查询,它的方法都是在PHP代码中做递归查询。这种方式效率相当低下,在数据量大的时候(几万个案例)完全无法接受。

实际上,一些高级的数据库支持直接在SQL中实现树形查询(或通过存储过程实现)。采用SQL树形查询后,速度可以提高成百上千倍。TestLink应该区分情况,针对特定的数据库采用不同的查询方式。

2、表结构设计
Nodes_hierachy是Testlink最核心的对象主干表,项目、需求、案例规约、案例、案例版本、步骤、测试计划……几乎所有对象(的基本信息)都保存在这个表中,导致此表记录数超多,相当影响性能。实际上每种对象有自己特定的逻辑,比如查找案例对应的步骤,在步骤表按照案例ID查就可以了,为什么要作为父子关系保存到这个表呢?我估计这个设计是为了复制对象时方便,但它对性能影响太大了。

另外,testlink的设计方式是:几乎所有的操作都限定在“当前项目”上;这样在查询所有信息时,都需要根据nodes_hierachy中的“项目”找到其子孙,然后从中过滤当前项目的记录,这也是性能差的一个原因。

如果是我来设计,首先会把固定层级的对象都从nodes_hierachy表剥离出来,这个只保存层级不定的对象(如需求或测试规约);其次,在各个表(包括nodes_hierachy)中都增加项目ID字段。

3、界面显示总数
在TestLink以树形结构展示信息时,每一级树干都会显示子节点个数,这导致它每次都必须组装整棵树,在数据量大的情况下导致PHP内存不足(前提是已经解决了树形查询的问题,否则就连内存不足都等不到呢)。这个设计当然有一定用处,但是它与性能有严重冲突,怎么办?鱼与熊掌不可得兼,舍鱼而取熊掌者也……

TestLink1.9.4已经出来了,据说主要是针对性能问题做的改进。如果上面这些问题没有解决,我估计它的性能不会有本质上的提高。
页: [1]
查看完整版本: TestLink的性能软肋