我正在用FuelPHP&mySql和我正在使用提供的ORM功能。问题出在以下表格上:
表:pdm_data
- 海量表(350+列,多行)
- 表数据相当静态(每天只更新一次)
- 主键:obj_id
表:change_request
- 只有几列
- 数据经常更改(10-20次/分钟)
- 引用主键(表pdm_data中的obj_id)
用户可以自定义对他们可见的数据表,例如,他们可以在列上保存过滤器(例如,change_request.obj_id=34 AND pdm_data.state=6),然后将这些列转换为使用ORM实时查询。
然而,使用ORM的查询确实很慢,因为表pdm_data很大,甚至大约100行都会导致许多MB的数据。最大的问题似乎出现在FuelPHP ORM中:即使查询本身相对较快,模型水合等也需要很多秒。理想的解决方案是缓存pdm_data表中的结果,因为它是相当静态的。然而,据我所知,FuelPHP不允许通过关系缓存表(您可以缓存查询的完整结果,因此可以缓存两个表,也可以不缓存)。
此外,使用带有联接的普通SQL查询而不是ORM并不是理想的解决方案,因为我需要处理水合模型非常棒的其他任务。
我目前有以下代码:
//Initialize the query and use eager-loading
$query = Model_Changerequest::query()->related('pdmdata');
foreach($filters as $filter)
{
//First parameter can point to either table
$query->where($filter[0], $filter[1], $filter[2]);
}
$result = $query->get();
有人对此有好的解决方案吗?
感谢阅读!
版本1 ORM的缓慢是一个已知的问题,v2正在解决这个问题。我目前的基准测试显示,v1 orm需要2.5秒(在我的机器上,ymmv)来水合40k行,而当前的v2 alpha大约需要800ms。
目前,我担心最简单的解决方案是取消大型选择的ORM,并使用DB
类构造查询。我知道您说过要保留ORM的抽象以便于开发,一种解决方案是使用as_object('MyModel')
返回填充的模型对象。
另一方面,如果性能是您主要关心的问题,那么ORM根本不合适。